Android:片段停止后停止新线程

时间:2014-04-07 11:53:45

标签: android multithreading android-fragments

我有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();

}}

3 个答案:

答案 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方法并仅在那里停止线程。