所以我在片段中有一个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这样的东西,但我是初学者,所以我现在想避免这样做。谢谢你的帮助。
答案 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();
}
}
}
}