بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

چگونگی استفاده از ترد هنگام جستجو در فایل های گوشی

مدیریت گفتگو
mortex 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام. من یه کد نوشتم که توی کل فایلهای گوشی جستجو انجام میده و فایلهای مورد نظر رو نمایش میده (براساس نام یا ...)

اما کد با تاخیر عمل میکنه و باعث میشه قسمتهای دیگه برنامه از کار بیفتن و وقتی هم میخوام از ترد استفاده کنم ارور میده. لطفا راهنماییم کنید که چطور میتونم اینکار رو انجام بدم

این هم کد:

         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);
                }
            }
        }
    }

نظرات

mortex 11 سال پیش
لطفا کمک کنید خیلی مهمه
mortex 11 سال پیش
کسی در این زمینه اطلاعاتی نداره بتونه کمکم کنه؟
Vahid 11 سال پیش
اینجا که شما از Thread استفاده نکردی؟ می تونی از کلاس AsyncTask بجای Thread استفاده کنی. هم راحته و هم اینکه مشکل UI Thread رو نداره.
mortex 11 سال پیش
من از AsyncTask هم استفاده کردم اما ارور داد. اگه میشه شما طریقه استفادشو بگین؟

پاسخ‌ها 1

Vahid 11 سال پیش

من کد شما رو با 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();
}
}
}
}
}

نظرات

mortex 11 سال پیش
من از این روش استفاده کردم اما به خطا برخوردم
Vahid 11 سال پیش
چه خطایی؟ متن خطا رو یزارین. چون من خودم با این روش جواب گرفتم.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .