我有Fragment
我在新Thread
的run方法中运行动画代码。由于线程运行时间过长,我想在用户离开片段时,通过按后退按钮或单击其他菜单项来停止它。
我尝试在onPause()
方法中使用thread.stop,thread.destroy,wait,suspend等,但没有任何帮助,它表示UnsupportedOperation
或Object未被锁定。并崩溃了应用程序。
这个要求的原因是如果我没有杀死该线程,那么当尝试退出应用程序时,它不会优雅地关闭应用程序并且在多次按下后退按钮时崩溃。
请建议一个好的方法来分别创建和切换片段来启动和杀死一个线程。
public class SearchFragment extends Fragment {
private Thread mAnimationThread;
public SearchFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.search_anim, container, false);
mAnimationThread = new Thread() {
//some code here
};
return rootView;
}
@Override
public void onResume() {
super.onResume();
Log.d("anim", "in resume");
Toast.makeText(getActivity().getApplicationContext() , "Resumed", Toast.LENGTH_LONG).show();
mAnimationThread.start();
} @Override
public void onPause() {
super.onPause();
Log.d("anim", "in pause");
Toast.makeText(getActivity().getApplicationContext(), "Paused",
Toast.LENGTH_LONG).show();
mAnimationThread.suspend();
}}
答案 0 :(得分:2)
请参阅此示例代码:
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new MyThread());
thread.start();
Thread.sleep(5);
thread.interrupt();
}
}
class MyThread implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Working.");
}
System.out.println("Interrupted.");
}
}
答案 1 :(得分:1)
Thread.stop()
非常气馁,因为它可能会以不安全的方式终止您的Thread
(您可能正在经历这种情况)。可能最好的方法就是在boolean
中设置一个Thread
控制器,所以当它是true
时,你会继续处理加载,一旦得到{{1} (您可以使用false
回调来控制),Fragment
来自return
,它会停止加载。
Thread
答案 2 :(得分:0)
覆盖on backpressed方法并仅在那里停止线程。