Java 运行、暂停和恢复线程
我的应用程序运行正常,但我不明白为什么我的void run();单击“主页”按钮时仍在后台运行 我希望我的线程在暂停时暂停线程,并在调用onResume()时再次启动线程 我想不出我做错了什么 我的代码:Java 运行、暂停和恢复线程,java,android,runnable,onresume,onpause,Java,Android,Runnable,Onresume,Onpause,我的应用程序运行正常,但我不明白为什么我的void run();单击“主页”按钮时仍在后台运行 我希望我的线程在暂停时暂停线程,并在调用onResume()时再次启动线程 我想不出我做错了什么 我的代码: public class MainActivity extends ActionBarActivity { Thread thread; @Override protected void onCreate(Bundle savedInstanceState) { super.on
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();
}
}
}
}
}
公共类MyThread实现可运行{
@凌驾
公开募捐{
而(!Thread.currentThread().isInterrupted()){
如果(Thread.currentThread().isInterrupted()){
打破
}
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
Log.d(“方法”,“无效运行()”);
//创建具有SharedReferences的文件并使其可编辑
SharedReferences首选项=GetSharedReferences(“MyPrime”,Context.MODE\u PRIVATE);
final SharedPreferences.Editor=preferences.edit();
随机=新随机();
BigInteger BigInteger=新的BigInteger(10,随机);
//加载并获取文件中的最后一个int值存储
SharedReferences首选项1=GetSharedReferences(“MyPrime”,Context.MODE\u PRIVATE);
final int numberInFile=preferences1.getInt(“MyPrime”,0);
if(bigInteger.isProbablePrime(random.nextInt(500))){
if(numberInFile这是因为您正在捕获并忽略中断线程时抛出的中断异常。不要忽略例外情况
如果您查看一下,您可以看到,如果您在线程等待睡眠
调用时中断该线程,将抛出该异常,并清除中断状态(即isInterrupted()
将返回false)。你的线程可能大部分时间都在睡眠调用中,因此很可能会被中断。从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()仍在每1秒运行一次logCat@Spoofy在暂停时,你需要终止线程。设置一个布尔变量或您习惯于执行的任何操作。让你的线程检查这个变量,决定是否继续循环谢谢!真管用!我刚刚了解了一些关于例外的情况!:)我将catch语句更改为:try{Thread.sleep(1000);}catch(interruptedeexception e){Thread.currentThread().interrupt();}