【问题标题】:Runnable, Pause and Resume thread可运行、暂停和恢复线程
【发布时间】:2015-05-13 19:01:44
【问题描述】:

我的应用程序运行良好,但我不知道为什么我的 void run();当我点击“主页”按钮时,仍然在后台运行。

我希望我的线程暂停线程 onPause 并在我调用 onResume() 时再次启动线程!

不知道我做错了什么!

我的代码:

public class MainActivity extends ActionBarActivity {

Thread thread;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    thread = new Thread(new MyThread());
    thread.start();

}


@Override
protected void onPause() {
    super.onPause();
    this.thread.interrupt();

    Log.d("Method:","OnPause();");



}

@Override
protected void onResume(){
    super.onResume();
    this.thread.run();
    Log.d("Method:","onResume();");

}


@Override
protected void onDestroy(){
    super.onDestroy();
    this.thread.interrupt();
    finish();
    Log.d("Method:","onDestroy();");

}

}

内部类:

public class MyThread implements Runnable{

    @Override
    public void run() {

        while(!Thread.currentThread().isInterrupted()){
            if(Thread.currentThread().isInterrupted()){

                break;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Log.d("Method","void run()");
            //Creates a file with SharedPreferences and make editable
            SharedPreferences preferences = getSharedPreferences("MyPrime", Context.MODE_PRIVATE);
            final SharedPreferences.Editor editor = preferences.edit();

            Random random = new Random();
            BigInteger bigInteger = new BigInteger(10,random);

            //Loads and gets the last int value store in the file
            SharedPreferences preferences1 = getSharedPreferences("MyPrime",Context.MODE_PRIVATE);
            final int numberInFile = preferences1.getInt("MyPrime",0);

            if(bigInteger.isProbablePrime(random.nextInt(500))){
                if(numberInFile < bigInteger.intValue()){
                    editor.putInt("MyPrime",bigInteger.intValue());
                    editor.commit();

                }
            }
        }

    }

}

【问题讨论】:

    标签: java android runnable onresume onpause


    【解决方案1】:

    这是因为您正在捕获并忽略在中断线程时抛出的InterruptedException。不要忽略异常!

    如果您查看the relevant docs,您会发现如果您在线程等待sleep 调用时中断该线程,则会引发该异常并且中断状态将被清除(即isInterrupted() 将返回 false)。而且你的线程可能大部分时间都花在那个睡眠调用上,所以它很可能在那里被打断。

    【讨论】:

    • 谢谢!那行得通!我刚刚学到了一些关于异常的东西! :) 我将 catch 语句更改为:try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
    【解决方案2】:

    从 onCreate 中删除代码并让你的 onResume 像这样工作。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    protected void onResume(){
        super.onResume();
        thread = new Thread(new MyThread());
        thread.start();
        Log.d("Method:","onResume();");
    }
    

    【讨论】:

    • 这并没有解决任何问题, void run() 在 logCat 中仍然每 1 秒运行一次
    • @Spoofy 在 onPause 中你需要杀死线程。设置一个布尔变量或你习惯做的任何事情。并让您的线程检查该变量以决定是否继续循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多