вызов обработчика из потока приводит к исключению NullPointerException - PullRequest
1 голос
/ 04 августа 2011

все

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

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

, и я так называю обработчик

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

Что делать?

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

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

попробуйте так:

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

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

1 голос
/ 04 августа 2011

Возможно, вы создали экземпляр 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);
    }
}
1 голос
/ 04 августа 2011

Где вы инициализируете свой actHandler?

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

...