我正在使用Asynctask从设备加载所有联系人。虽然已多次讨论过Contacts.Contract非常慢,并且需要10-15秒才能将所有联系人数据加载到图像和所有其他数据(如电子邮件等)。所以我决定在启动画面上使用asynctask启动服务。 现在的问题是 我有活动系列A-B-C-D Asynctask从活动A开始,我想要活动D中的联系人。如果所有联系人都被加载,直到用户到达活动D,那么确定。但是,如果用户到达活动D并且服务仍在运行,那么我需要让用户等待。
所以我的问题是如何在活动D中等待ASYNCTASK完成。我将在活动D中显示一个简单的进度条,直到Asynctask结束。但是如何?
答案 0 :(得分:1)
要等待AsyncTask完成,您可以使用get()方法。 从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基本上有onPreExecute
和doInbackground
,并且onPostExecute
存在。每个人的意思!
onPreExecute
:
在doInBackground (Params. ..)
之前在UI线程上运行。
opPostExecute
:
在doInBackground (Params. ..)
之后在UI线程上运行。指定的结果是doInBackground (Params. ..)
返回的值。
如果任务被取消,则不会调用此方法。
通话的顺序
一。 onPreExecute
两个。 doInbackground
三。 onPostExecute
但是doInbackground
在另一个线程中运行。
必须妥善处理doInbackground
结果传递三次,因为onPreExecute()
创建了一个进度条进度条以结束其onPostExecute
可以正常工作。