如何解决在任务期间显示进度对话框而不阻塞 Android 中的 UI 线程
@Override
protected void onCreate (Bundle savedInstanceState) {
progressDialog.show();
if (/* task that returns a boolean value */) {
// Do stuff
}
else {
// Do other stuff
}
progressDialog.dismiss();
}
此代码应显示进度对话框,等待任务产生其结果,然后评估 if
语句并关闭对话框。但这不会发生:UI 线程被阻塞,任务被执行,然后才显示进度对话框,然后立即解除。
解决这个问题的正确方法是什么?
解决方法
一个简单的worker thread。
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
// a potentially time consuming task
}
}).start();
}
根据您在此 answer 中提到的要求,可以考虑其他替代方案。
,您可以为此使用 AsyncTask,但是,它在 Sdk 30 中已被弃用,建议直接使用 java.concurrent.* 实用程序 docs。以下是使用ExecutorService的解决方法,虽然不完美,但绝对满足你的功能:
在您的 Activity(例如 MyActivity)中,创建 ExecutorService 的成员并对其进行初始化。添加方法和回调如下,当你想执行一些后台任务时,只需调用它:
public class MyActivity extends AppCompatActivity {
// You can use your preferred executor
private final ExecutorService executor = new ThreadPoolExecutor(0,1,3L,TimeUnit.SECONDS,new LinkedBlockingQueue<>());
@Override
protected void onCreate (Bundle savedInstanceState) {
// Initiate the task
executeParallel(new Callable<Boolean> {
@Override
public Boolean call() {
// Perform your task and return boolean
return trueOrFalse;
}
},new Callback<Boolean>() {
@Override
public void onStart() {
// Show progress dialog
progressDialog.show();
}
@Override
public void onComplete(Boolean result) {
if (result) {
// Do some tasks
} else {
// Do other tasks
}
// Remove dialog
progressDialog.dismiss();
}
},new Handler(Looper.getMainLooper()));
}
public <R> void executeParallel(@NonNull Callable<R> callable,@Nullable Callback<R> callback,Handler handler) {
executor.execute(() -> {
handler.post(() -> {
if (callback != null) {
callback.onStart();
}
});
R r = null;
try {
r = callable.call();
} catch (Exception e) {
// Ignore
} finally {
R result = r;
handler.post(() -> {
if (callback != null) {
callback.onComplete(result);
}
});
}
});
}
public interface Callback<R> {
void onStart();
void onComplete(R result);
}
}
完成后,只需关闭 ExecutorService。如果您使用它们进行更好的设计,则可以将这个 Executor 和相关方法移到 ViewModel 中。请记住,您不应直接使用 Thread 以避免潜在的内存泄漏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。