2011-08-04 3 views
1

всевызова обработчика из нити приводит к NullPointerException

мне нужно вызвать обработчик из нити и я делаю как этот

new Thread(){ 
public void run(){ 
try{ 
Thread.sleep(2000); 
} 
catch(Exception ex){} 
actHandler.sendEmptyMessage(0); 
} 
}.start(); 

и я звоню Handler как этот

actHandler=new Handler(){ 
public void handleMessage(android.os.Message msg) 
{ 
} 
}; 

несколько раз работает нормально и несколько раз приводит к исключению NullPointerException на линии actHandler.sendEmptyMessage (0);

Это все мой код

public class Casinos extends Activity { 
ProgressDialog pd; 
Handler actHandler; 
@Override 
public void onCreate(Bundle bundle){ 
super.onCreate(bundle); 
pd=ProgressDialog.show(this,"","Please wait..."); 
new Thread(){ 
public void run(){ 
try{ 
Thread.sleep(2000); 
} 
catch(Exception ex){} 
actHandler.sendEmptyMessage(0); 
} 
}.start(); 
setContentView(R.layout.casinos); 
actHandler=new Handler(){ 
public void handleMessage(android.os.Message msg) 
{ 
super.handleMessage(msg); 
pd.dismiss(); 
} 
}; 
} 

Что делать?

Заранее спасибо.

+0

Вы уверены, что каждый раз правильно инициализируете обработчик? – Egor

+0

попробуйте этот 'if (actHandler! = Null) actHandler.sendEmptyMessage (0);' – dhblah

+0

, то как я могу вызвать дескриптор public void handleMessage (android.os.Message msg) – surendra

ответ

1

Возможно, вы создали экземпляр actHandler после заявления new Thread().

actHandler = new Handler(); 

Пожалуйста, покажите нам еще несколько кодов для проверки, но это, вероятно, так.

РЕШЕНИЕ

Вы инициализирован actHandler после объявления темы

public class Casinos extends Activity { 
    ProgressDialog pd; 
    Handler actHandler; 
    @Override 
    public void onCreate(Bundle bundle){ 
     super.onCreate(bundle); 
     pd=ProgressDialog.show(this,"","Please wait..."); 
     //move this HERE!! 
     actHandler=new Handler(){ 
      public void handleMessage(android.os.Message msg) 
      { 
       super.handleMessage(msg); 
       pd.dismiss(); 
      } 
     }; 

     new Thread(){ 
      public void run(){ 
       try{ 
        Thread.sleep(2000); 
       } 
       catch(Exception ex){} 
       actHandler.sendEmptyMessage(0); 
      } 
     }.start(); 
     setContentView(R.layout.casinos); 
    } 
} 
+0

я добавил actIndler intialization now see it – surendra

+0

@surendra show мне весь ваш код, пожалуйста –

+0

Я ввел все свой код, теперь скажите мне, что делать – surendra

1

Где вы начинаете использовать actHandler?

Если он находится в другом потоке, убедитесь, что инициализация вызывается раньше. (самое лучшее, что можно сделать, может быть инициализация, как только сможете)

2

попробовать так:

Message msg = new Message(); 
msg.arg1 = int value; 
actHandler.sendMessage(msg); 

В вашем случае, если петлитель обработки очереди messsage покидает затем он вернет сбой.

Смежные вопросы