آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

mortex  10 سال پیش  10 سال پیش
+2 0

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

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

این هم کد:

         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();
}
}
}
}
}
0 0
من از این روش استفاده کردم اما به خطا برخوردم (10 سال پیش)
0 0
چه خطایی؟ متن خطا رو یزارین. چون من خودم با این روش جواب گرفتم. (10 سال پیش)

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