Sam*_*muh 107 android android-asynctask
我在后台线程中运行远程音频文件获取和音频文件播放操作AsyncTask
.甲Cancellable
进度条示出了用于提取操作运行的时间.
我想AsyncTask
在用户取消(决定)操作时取消/中止运行.处理这种情况的理想方式是什么?
yan*_*nko 78
才发现,原来AlertDialogs
的boolean cancel(...);
我已经用实际处处什么也不做.大.
所以...
public class MyTask extends AsyncTask<Void, Void, Void> {
private volatile boolean running = true;
private final ProgressDialog progressDialog;
public MyTask(Context ctx) {
progressDialog = gimmeOne(ctx);
progressDialog.setCancelable(true);
progressDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
// actually could set running = false; right here, but I'll
// stick to contract.
cancel(true);
}
});
}
@Override
protected void onPreExecute() {
progressDialog.show();
}
@Override
protected void onCancelled() {
running = false;
}
@Override
protected Void doInBackground(Void... params) {
while (running) {
// does the hard work
}
return null;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
wry*_*iel 76
如果你正在进行计算:
isCancelled()
定期检查.如果您正在执行HTTP请求:
HttpGet
或HttpPost
某处的实例(例如,公共字段).cancel
,打电话request.abort()
.这将导致IOException
你的内心被抛出doInBackground
.在我的例子中,我有一个连接器类,我在各种AsyncTasks中使用它.为了简单起见,我abortAllRequests
在该类中添加了一个新方法,并在调用后直接调用此方法cancel
.
小智 20
问题是AsyncTask.cancel()调用只调用任务中的onCancel函数.这是您要处理取消请求的位置.
这是我用来触发更新方法的一个小任务
private class UpdateTask extends AsyncTask<Void, Void, Void> {
private boolean running = true;
@Override
protected void onCancelled() {
running = false;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
onUpdate();
}
@Override
protected Void doInBackground(Void... params) {
while(running) {
publishProgress();
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
Com*_*are 11
简单:不要使用AsyncTask
.AsyncTask
设计用于快速结束(数十秒)的短操作,因此不需要取消."音频文件播放"不符合条件.您甚至不需要后台线程来播放普通音频文件.
归档时间: |
|
查看次数: |
136128 次 |
最近记录: |