Android AsyncTask - 避免多个实例运行

kat*_*tit 16 android

我有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)


Tho*_*nan 6

将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)

}