由于线程在方向更改之前未停止而导致空指针错误

时间:2013-04-29 21:56:29

标签: java android multithreading android-handler

我有一个片段显示运行后台线程的天气数据,该后台线程基本上只调用主UI中的函数来检查我的预测是否仍然有效。此函数更新UI,因此我使用Handler并将Runnable发布到主线程,如下所示:

public class WaveFxListFragment extends Fragment implements
        LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {

    // .....

    // handler for dealing with synchronising update thread with UI
    private Handler mHandler;
    private UpdateThread mUpdateThread;

    private class UpdateThread extends Thread {
        volatile boolean running = false;

        @Override
        public void run() {
            running = true;

            while (running) {
                // get main UI thread to perform update check:
                Log.d(TAG, "Handler is " + mHandler);
                mHandler.post(new Runnable() { // getting null pointer error here!
                    @Override
                    public void run() {
                        checkValidTime();
                    }
                });

                try {
                    Thread.sleep(1000); // sleep 1 second
                } catch (InterruptedException e) {
                    Log.d(TAG, "Thread was interrupted!");
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Reuse existing handler:
        mHandler = getActivity().getWindow().getDecorView().getHandler();
    }

    @Override
    public void onResume() {
        super.onResume();
        // start update checker:
        mUpdateThread = new UpdateThread();
        mUpdateThread.start();
    }

    @Override
    public void onPause() { 
            // stop update thread
            Log.d(TAG, "Asking thread to stop");
            mUpdateThread.running = false;

            super.onPause();
    }
}

这很好用;问题是当我改变屏幕方向时。当前活动被破坏,如果线程正在运行,它会尝试将Runnable发布到不再存在的UI线程。因此,我在running类中添加了UpdateThread成员变量,并在我的活动调用false时设置为onPause。但是,即使我将UpdateThread.running变量设置为false,我的线程仍会尝试发布Runnable,但Handler现在为空!它不应该那么远,但它是!

我这样做错了吗?我的日志消息“要求线程停止”被打印出来,所以我知道它正在将运行设置为假。

有人能提供见解吗?

由于

1 个答案:

答案 0 :(得分:0)

您可以采取一些措施来解决此问题。

  1. 将运行设置为false后中断线程。这应该导致线程提前退出,或者至少使错误更早出现。

  2. 检查您的处理程序在更新线程中是否为空,并在onPause中将其设置为null。

  3. 将mHandler的赋值移动到onResume,以确保在调用更新线程时mHandler有效。