0

我有一个显示天气数据的片段,它运行一个后台线程,基本上只是在我的主 UI 中调用一个函数来检查我的预测是否仍然有效。此函数更新 UI,因此我使用 aHandler并将 a 发布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();
    }
}

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

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

任何人都可以提供见解吗?

谢谢

4

1 回答 1

0

你可以做一些事情来解决这个问题。

  1. 将 running 设置为 false 后中断线程。这应该会导致线程更早退出,或者至少让您的错误更早出现。

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

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

于 2013-04-29T22:38:03.113 回答