Android:获取Asynctask的状态并等待

时间:2014-03-31 10:23:27

标签: android android-asynctask

我正在使用Asynctask从设备加载所有联系人。虽然已多次讨论过Contacts.Contract非常慢,并且需要10-15秒才能将所有联系人数据加载到图像和所有其他数据(如电子邮件等)。所以我决定在启动画面上使用asynctask启动服务。 现在的问题是 我有活动系列A-B-C-D Asynctask从活动A开始,我想要活动D中的联系人。如果所有联系人都被加载,直到用户到达活动D,那么确定。但是,如果用户到达活动D并且服务仍在运行,那么我需要让用户等待。

  

所以我的问题是如何在活动D中等待ASYNCTASK完成。我将在活动D中显示一个简单的进度条,直到Asynctask结束。但是如何?

6 个答案:

答案 0 :(得分:1)

要等待AsyncTask完成,您可以使用get()方法。 从get()方法的文档:

  

如果需要等待计算完成,然后检索   结果。

AsyncTask - get()

但这会使你的主线程等待AsyncTask的结果。

另一种方法是,您可以在异步任务中显示进度对话框,直到完成为止。这样您就可以获得状态调用:

task.getStatus() == Status.RUNNING

如果状态为Status.RUNNING,您将只显示进度对话框,直到完成为止。所以,作为一个例子:

    final AsyncTask task = MyAsyncTask.getInstance();

    final Thread waitingThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                // ...
                // show progress dialog
                while(task.getStatus() != Status.FINISHED) {
                    TimeUnit.SECONDS.sleep(1);
                }
                result = task.get();
                // ...
                // hide progress dialog
            } catch (InterruptedException e) {
                // TODO log
            }
        }
    });

    waitingThread.start();

task对象是你的asyncTask。您可以将它设为Singleton并从Activity A开始,并在Activity D中获取它的实例。

public class MyAsyncTask extends AsyncTask<Void, Void, Void>{

        private static MyAsyncTask instance;

        private MyAsyncTask(){}

        public static MyAsyncTask getInstance() {
            // check status if we want to execute it again
            if (instance == null) {
                instance = new MyAsyncTask();
            } else if (instance.getStatus() == Status.FINISHED) {
                instance = new MyAsyncTask();
            }

            return instance;
        }

        @Override
        protected Void doInBackground(Void... params) {
            // do smth
            return null;
        }
}

Haven没有尝试过这个,但我认为它会起作用。

答案 1 :(得分:1)

我有一个想法只在一个异步任务中创建异步系列

protected Boolean doInBackground(String... params) {
            if(params[0] == "taskA") {
              //do somthing
              params[0] = "taskB";
            }
            if(params[0] == "taskB") {
              //do somthing
              params[0] = "taskC";
            }
            if(params[0] == "taskC") {
              //do somthing
              params[0] = "taskD";
            }
            if(params[0] == "taskD") {
              //do somthing
              return true;
            }

在主线程中只需调用异步任务:

ShowMyProgress();
new MyAsyncTask().execute("taskA");

最后,你可以在onPostExecute中隐藏你的进度,如:

protected void onPostExecute(final Boolean success) {
        if (success) {
            ....

            HideMyProgress();
        }
}

答案 2 :(得分:0)

你可以做到

myAsyn asyn = new myAsyn();
asyn.execute();

while(asyn.getStatus()!=Aynctask.Status.Finished)
{
Thread.sleep(100);
}

而不是等待asyntask完成,您只需显示进度对话框。

public class myAsyn extends AsyncTask<Void, Void, Void>{


    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        dialog = new ProgressDialog(context);
        dialog.setMessage("Loading...");
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }

    @Override
    protected Void doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        //do your work
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        dialog.dismiss();
      }
     }

答案 3 :(得分:0)

很简单,我会解释..

您可以获取异步任务任务的状态...像这样

if (o2.getStatus() == Status.FINISHED) { ////o2 is a asynch task instance...

} else if (o2.getStatus() == Status.RUNNING) {

} else if (o2.getStatus() == Status.PENDING) {

}

答案 4 :(得分:0)

请试试这个

public class LoadData extends AsyncTask<Void, Void, Void> {
    ProgressDialog progressDialog;
    //declare other objects as per your need
    @Override
    protected void onPreExecute()
    {
        progressDialog= ProgressDialog.show(YourActivity.this, "Progress Dialog Title Text","Process Description Text", true);

        //do initialization of required objects objects here                
    };      
    @Override
    protected Void doInBackground(Void... params)
    {   

         //do loading operation here  
        return null;
    }       
    @Override
    protected void onPostExecute(Void result)
    {
        super.onPostExecute(result);


  progressDialog.dismiss();
    };
 }

您可以使用

调用此方法
LoadData task = new LoadData();
task.execute();

检查您的服务是否仍在运行::

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (MyService.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

答案 5 :(得分:0)

AsyncTask基本上有onPreExecutedoInbackground,并且onPostExecute存在。每个人的意思!

onPreExecute: 在doInBackground (Params. ..)之前在UI线程上运行。

opPostExecute: 在doInBackground (Params. ..)之后在UI线程上运行。指定的结果是doInBackground (Params. ..)返回的值。

如果任务被取消,则不会调用此方法。

通话的顺序

一。 onPreExecute

两个。 doInbackground

三。 onPostExecute

但是doInbackground在另一个线程中运行。

必须妥善处理doInbackground结果传递三次,因为onPreExecute()创建了一个进度条进度条以结束其onPostExecute可以正常工作。