在 activity 开关的情况下,停止(线性)runnable 的 "nice" 方法是什么?
What's a "nice" way of stopping a (linear) runnable in case of activity switch?
我有一个线程将执行一些处理,然后有可运行的代码将在屏幕上显示结果。问题是,如果用户在可运行对象位于两行显示代码之间时按下后退箭头,下一行将崩溃,因为 activity 不再存在。
下面的代码实现了目标,但我讨厌在每一行之前有 if
语句。有没有更好的方法?
@Override
public void onBackPressed() {
super.onBackPressed();
imgThread.interrupt();
}
private void processImage(){
final Handler mHandler = new Handler(Looper.getMainLooper());
progress = new ProgressDialog(this);
progress.setMessage("TEXT");
progress.setIndeterminate(true);
progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progress.show();
imgThread = new Thread(){
@Override
public void run() {
//Process the image a bit
mHandler.post(new Runnable() {
@Override
public void run() {
if(!imgThread.isInterrupted())
imageView.setImageBitmap(mDisplayBitmap);
if(!imgThread.isInterrupted())
progress.setMessage("TEXT TEXT");
if(!imgThread.isInterrupted())
progress.show();
}
});
//More processing
mHandler.post(new Runnable() {
@Override
public void run() {
if(!imgThread.isInterrupted())
addScreenListener();
if(!imgThread.isInterrupted())
determineHelpToast("TEXT TEXT TEXT", Toast.LENGTH_LONG);
if(!imgThread.isInterrupted())
progress.dismiss();
}
});
}
}; imgThread.start();
}
真正安全的方法是修改您的 Runnable,使其永远不会引用 Android 上下文(Activity 等)。
最简单的方法是通过事件总线将更改传达给 Activity。
我有一个线程将执行一些处理,然后有可运行的代码将在屏幕上显示结果。问题是,如果用户在可运行对象位于两行显示代码之间时按下后退箭头,下一行将崩溃,因为 activity 不再存在。
下面的代码实现了目标,但我讨厌在每一行之前有 if
语句。有没有更好的方法?
@Override
public void onBackPressed() {
super.onBackPressed();
imgThread.interrupt();
}
private void processImage(){
final Handler mHandler = new Handler(Looper.getMainLooper());
progress = new ProgressDialog(this);
progress.setMessage("TEXT");
progress.setIndeterminate(true);
progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progress.show();
imgThread = new Thread(){
@Override
public void run() {
//Process the image a bit
mHandler.post(new Runnable() {
@Override
public void run() {
if(!imgThread.isInterrupted())
imageView.setImageBitmap(mDisplayBitmap);
if(!imgThread.isInterrupted())
progress.setMessage("TEXT TEXT");
if(!imgThread.isInterrupted())
progress.show();
}
});
//More processing
mHandler.post(new Runnable() {
@Override
public void run() {
if(!imgThread.isInterrupted())
addScreenListener();
if(!imgThread.isInterrupted())
determineHelpToast("TEXT TEXT TEXT", Toast.LENGTH_LONG);
if(!imgThread.isInterrupted())
progress.dismiss();
}
});
}
}; imgThread.start();
}
真正安全的方法是修改您的 Runnable,使其永远不会引用 Android 上下文(Activity 等)。
最简单的方法是通过事件总线将更改传达给 Activity。