我有AsyncTask处理一些后台HTTP的东西.AsyncTask按计划运行(警报/服务),有时用户手动执行它.
我从SQLite处理记录,我注意到服务器上的双帖,它告诉我有时计划的任务运行,同时用户手动运行它,导致相同的记录从DB读取和处理两次.我在处理后删除了记录,但仍然得到了这些记录.
我应该怎么处理?也许组织某种排队?
Ren*_*eno 17
您可以在Executor使用时执行AsyncTaskexecuteOnExecutor()
要确保线程以串行方式运行,请使用:SERIAL_EXECUTOR.
杂项:如何使用Executor
如果有几个活动正在访问您的数据库,为什么不创建一种网关数据库帮助程序并使用该synchronized块来确保只有一个线程可以立即访问它
Bon*_*ver 10
或者,您可以尝试此操作以查看任务当前是否正在运行:
if (katitsAsyncTask.getStatus().equals(AsyncTask.Status.FINISHED))
katitsAsyncTask.execute();
else
// wait until it's done.
Run Code Online (Sandbox Code Playgroud)
将AsyncTask初始化为null.如果为null,则仅创建一个新的.在onPostExecute中,最后再次将其设置为null.如果用户取消此操作,请在onCancelled中执行相同操作.这里有一些未经测试的代码来说明基本思想.
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FooActivity extends Activity {
private class MyAsyncTask extends AsyncTask<Foo, Foo, Foo> {
@Override
protected void onPostExecute(Foo foo) {
// do stuff
mMyAsyncTask = null;
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
mMyAsyncTask = null;
}
@Override
protected Foo doInBackground(Foo... params) {
try {
// dangerous stuff
} catch (Exception e) {
// handle. Now we know we'll hit onPostExecute()
}
return null;
}
}
private MyAsyncTask mMyAsyncTask = null;
@Override
public void onCreate(Bundle bundle) {
Button button = (Button) findViewById(R.id.b2);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (mMyAsyncTask == null) {
mMyAsyncTask = new MyAsyncTask();
mMyAsyncTask.execute(null);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
}