خطا در Handler
سلام دوستان از آموزش تایمر استاد متوجه شدم که توابعی که به ترد UI مربوط هستند رو باید داخل ترد اصلی و یا handler اجرا کرد. حالا من یک تابع دارم که باید توسط یک ترد فراخوانی بشه و نتیجه این فراخوانی داخل یک textView ست بشه. و طبق آموزش ها این ست شدن باید داخل handler انجام بشه. اما برخلاف انتظار کرش میکنه و خطای زیرو میده:
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
این هم کدم:
public class ThreadHelper extends Thread {
private TextView textView;
public String desc;
private ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
public void setParams(String idNumber){
params.add(new BasicNameValuePair("id",idNumber));
}
public void setTextView(TextView view){
textView=view;
}
@Override
public void run(){
super.run();
desc=Commands.read(params);
if(textView!=null){
G.HANDLER.post(new Runnable() {
@Override
public void run() {
textView.setText(desc);
}
});
}
}
}
سلام
مشکل کد شما این هست که نباید داخل تابع Run یه ترد ( چه کلاسی که از ترد اکستند شده و یا یه نمونه ساخته شده از کلاس ترد ) از هندلر استفاده کنید . اگر بخوایم چند راه پیشنهاد بدیم ممکنه پیچیده بشه . پس تنها یه راه که هم ساده باشه هم کار رو به خوبی انجام بده کافیه . بنابراین :
1. یه تابع استاتیک درون کلاس Commands با نام دلخواه ولی مناسب ایجاد کنید.
نمونه تابعی که باید ایجاد کنید بهمراه کدهای درون اون :
public static void instanceMethod ( TextView view , String idNumber )
{
private TextView textView;
public String desc;
private ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(newBasicNameValuePair("id",idNumber));
textView = view;
desc=Commands.read(params);
G.HANDLER.post(newRunnable(){
@Override
publicvoidrun(){
textView.setText(desc);
}
});
}
2. کد هایی که مربوط بود به کلاس قبلی رو از اکتیویتی اصلی پاک کنید و بجاش یه نمونه از کلاس Thread بسازید و کد زیر رو درون اون فراخوانی کنید :
Commands.instanceMethod(textView , idNumber);
در متد بالا بجای idNumber و textView متغیرهای لازم رو جایگزین کنید .
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .