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

خطا در Handler

Sara.gh  9 سال پیش  9 سال پیش
0 0

سلام دوستان از آموزش تایمر استاد متوجه شدم که توابعی که به ترد 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);
}
});
}
}
}
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
MOHAMAD  9 سال پیش
+3 0

سلام

مشکل کد شما این هست که نباید داخل تابع 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 متغیرهای لازم رو جایگزین کنید .

 
0 0
سپاسگزارم. بله این درسته! (9 سال پیش)

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