بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
چگونگی استفاده از ترد هنگام جستجو در فایل های گوشی
سلام. من یه کد نوشتم که توی کل فایلهای گوشی جستجو انجام میده و فایلهای مورد نظر رو نمایش میده (براساس نام یا ...)
اما کد با تاخیر عمل میکنه و باعث میشه قسمتهای دیگه برنامه از کار بیفتن و وقتی هم میخوام از ترد استفاده کنم ارور میده. لطفا راهنماییم کنید که چطور میتونم اینکار رو انجام بدم
این هم کد:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
SearchByName("/sdcard/", "Wallpaper");
}
});
public void SearchByName(String path, String fileName) {
File root_dir = new File(path);
String[] list = root_dir.list();
if (list != null && root_dir.canRead()) {
int len = list.length;
for (int i = 0; i < len; i++) {
File check = new File(path + "/" + list[i]);
String name = check.getName();
if (check.isFile() && name.toLowerCase().
contains(fileName.toLowerCase())) {
edt.setText(edt.getText().toString() + check.getPath());
}
else if (check.isDirectory()) {
if (name.toLowerCase().contains(fileName.toLowerCase())) {
edt.setText(edt.getText().toString() + check.getPath());
}
else if (check.canRead() && !path.equals("/"))
SearchByName(check.getAbsolutePath(), fileName);
}
}
}
}
0
0
لطفا کمک کنید خیلی مهمه (10 سال پیش)
0
0
کسی در این زمینه اطلاعاتی نداره بتونه کمکم کنه؟ (10 سال پیش)
0
0
اینجا که شما از Thread استفاده نکردی؟ می تونی از کلاس AsyncTask بجای Thread استفاده کنی. هم راحته و هم اینکه مشکل UI Thread رو نداره. (10 سال پیش)
0
0
من از AsyncTask هم استفاده کردم اما ارور داد. اگه میشه شما طریقه استفادشو بگین؟ (10 سال پیش)
برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال
Vahid
10 سال پیش
+3
0
من کد شما رو با AsyncTask اینجوری نوشتم:
ابتدا دو تا فیلد public در سطح اکتیویتی تعریف کردم:
public String path;
public String fileName;
کد کلیک دکمه رو به صورت زیر تغییر دادم:
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
path = "/sdcard/";
fileName = "astro.db";
new SearchSync().execute();
}
});
و یک کلاس به نام SearchSync به صورت زیر تعریف کردم که از AsyncTask ارث بری کرده:
public class SearchSync extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
SearchByName();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
و در ضمن چون متغییر های path و fileName رو به صورت فیلد تعریف کردم از لیست ورودی های متد SearchByName حذف شون کردم و متد SearchByName اینجوری شد:
public void SearchByName() {
File root_dir = new File(path);
String[] list = root_dir.list();
if (list != null && root_dir.canRead()) {
int len = list.length;
for (int i = 0; i < len; i++) {
File check = new File(path + "/" + list[i]);
String name = check.getName();
if (check.isFile()
&& name.toLowerCase().contains(fileName.toLowerCase())) {
edt.setText(edt.getText().toString() + check.getPath());
} else if (check.isDirectory()) {
if (name.toLowerCase().contains(fileName.toLowerCase())) {
edt.setText(edt.getText().toString() +
check.getPath());
} else if (check.canRead() && !path.equals("/")) {
path = check.getAbsolutePath();
SearchByName();
}
}
}
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .