Android:即使Activity被销毁,Thread似乎也没有被破坏

时间:2013-06-07 06:52:32

标签: android

所以我在片段中有一个Thread'ThreadDemo'来做一些计算并使用getActivity()。runOnUiThread()来更新TextView。它运行正常,但是当我退出应用程序时,它会在getActivity()上给出NPE。根据我对android中的线程的了解,它们应该在Activity被销毁时停止但是在这里,由于某种原因,它继续并且无法找到活动,因为我关闭了它。这是我的片段中的我的线程代码 -

 public class ThreadDemo implements Runnable {


           int hour, minute, second, day=0;


           public void run() {
               while((196-day)>=0) {

                   Calendar cal = Calendar.getInstance();
                    day = cal.get(Calendar.DAY_OF_YEAR);
                    hour = cal.get(Calendar.HOUR_OF_DAY);
                    minute = cal.get(Calendar.MINUTE);
                    second = cal.get(Calendar.SECOND);

                    try {
**NPE here**             getActivity().runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                ....
                            }
                        });
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }                   
              }
           }


        } 

这是LogCat -

06-07 12:05:28.903: E/AndroidRuntime(19834): FATAL EXCEPTION: Thread-5858
06-07 12:05:28.903: E/AndroidRuntime(19834): java.lang.NullPointerException
06-07 12:05:28.903: E/AndroidRuntime(19834):    at com.example.mapsapiv2demo.Fragment3$ThreadDemo.run(Fragment3.java:59)
06-07 12:05:28.903: E/AndroidRuntime(19834):    at java.lang.Thread.run(Thread.java:856)

注意:我试图在onPause方法中手动停止线程,但似乎不推荐使用stop()方法,不推荐使用。知道我做错了什么或有什么建议可以解决?我知道像asynctask这样的东西,但我是初学者,所以我现在想避免这样做。谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

只需在循环中进行检查:

if(shouldStop) {
    break;
}

答案 1 :(得分:0)

停止一个帖子并不像看起来那么简单。阅读更多here。我建议你在活动被销毁时在你的线程中设置一个标志,如果你应该突破线程中的循环,则检查这个标志。例如:

public class YourActivity extends Activity {

    private YourThread thread;

    @Override
    public void onStop() {
        super.onStop();
        thread.stopNow();
    }   
}

public class YourThread extends Thread {

    private boolean stopNow = false;

    public void stopNow() {
        stopNow = true;
    }

    public void run() {
        while(someCondition && !stopNow) {
            // do something
            if(!stopNow) {
                getActivity().runOnUiThread(...)
            }
        }
    }

}

您还可以查看切换为AsyncTask,并在cancel()检查doInBackground()的循环中调用isCancelled()

答案 2 :(得分:0)

活动

 private Thread thread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        thread = new Thread(new ThreadDemo());
        thread.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        thread.interrupt();
    }

可运行

class ThreadDemo implements Runnable {


        int hour, minute, second, day = 0;


        public void run() {
            while ((196 - day) >= 0 && !Thread.currentThread().isInterrupted()) {

                Calendar cal = Calendar.getInstance();
                day = cal.get(Calendar.DAY_OF_YEAR);
                hour = cal.get(Calendar.HOUR_OF_DAY);
                minute = cal.get(Calendar.MINUTE);
                second = cal.get(Calendar.SECOND);

                try {
                    getActivity().runOnUiThread(new Runnable() {

                        @Override
                        public void run() {

                        }
                    });
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Thread.currentThread().interrupt();
                }
            }
        }


    }