从线程中调用Handler会导致NullPointerException



我需要从Thread中调用Handler,这是我的Thread:

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

该怎么办?

试试:

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

在你的例子中,如果循环器处理消息队列正在退出,那么它将返回失败。

您可能在new Thread()语句之后实例化了actHandler

actHandler = new Handler();

请给我们更多的代码来验证,但这可能是这种情况。

<<p> 解决方案/strong>

在线程声明之后初始化了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);
    }
}

您在哪里初始化您的actHandler ?

如果它在另一个线程中,请确保之前调用了初始化。(最好的方法可能是尽快初始化)

相关内容

最新更新