我怎么知道异步任务何时返回

时间:2013-12-05 13:29:58

标签: android

我有一个异步任务从服务器加载图片网址。加载网址后,我将图像逐个加载到另一个异步任务中。 单击按钮,我启动第一个asynctask

    public void getit(View v)
    {

        new getdata().execute("http://10.0.2.2/geturls.php");
// line no 2
    }

在我获取网址后,我使用另一个异步任务来加载图片。 如何找出图像网址已加载的时间,我可以在第2行调用第二个异步任务。 如果我使用一个布尔变量,我在onpostexecute中切换

 @Override
            protected void onPostExecute() {
urlgot=true;
}

然后我将不得不在第2行的getit方法中使用一些重复循环来检查这个变量urlgot的状态。但它可能需要比ui线程允许的时间更长的时间。 可以有更清洁的方法来进行此检查。 感谢

6 个答案:

答案 0 :(得分:2)

我能想到两种解决方案:

1)你创建一个AsyncTask来完成所有事情(获取网址,下载所有图像)。比你知道什么时候开始下载图像。

2)从第一个AsyncTask的onPostExecute()开始下一个AsyncTask。

答案 1 :(得分:0)

如果不违反AsyncTask的目的,您将无法在//line no 2中完成下一项工作。如果您正在进行网络活动,则需要异步进行,因此这不是一个选项。

相反,在onPostExecute()中,您可以在活动中调用另一种方法来执行您在//line no 2中所做的操作。这样做是安全的,因为onPostExecute()发生在UI线程上。

但根据您的设计,在//line no 2中执行原始AysncTask中的所有onPostExecute内容可能更有意义,因此您只需执行一项任务即可完成所有工作。

答案 2 :(得分:0)

我使用自定义界面在执行后执行操作。

public Interface OnDataReceived
{
    public void onReceive( Object result);
}

和MyASyncTask

public class MyAsyncTask extends ASyncTask<Object,Object,Object>
{
    OnDataReceived receiver;
    public MyAsyncTask( OnDataReceived receiver )
    {
        this.receiver  = receiver;
    }
...
    protected void onPostExecute( Object result)
    {
        receiver.onreceive( result );
    }
}

让我的主类实现OnDataReceived

public class Main implements OnDataReceived 
{
....
    public void getit(View v)
    {
        new MyAsyncTask(this).execute("http://10.0.2.2/geturls.php");
    }
    @override
    public void onReceive( Object result)
    {
        // do whatever
    }
}

修改

即使是更多控制,您也可以添加onFailed并将界面重命名为OnResponse

public Interface OnResponse
{
    public void onReceive( Object result);
    public void onFailed( Object errcode);
}

答案 3 :(得分:0)

您可以创建interface,将其传递给AsyncTask(在构造函数中),然后在onPostExecute中调用方法

例如:

您的界面:

public interface OnTaskCompleted{
    void onTaskCompleted();
}

您的活动:

public YourActivity implements OnTaskCompleted{
    //your Activity
}

你的AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted();
    }
}

答案 4 :(得分:0)

使用Handler。在AsyncTask的onPostExecute方法中,您可以发送一条消息,通知处理程序启动另一个AsyncTask。

这样的事情:

@Override
    protected void onPostExecute(Void res) {            

        MyHandlerHandler handler = new MyHandlerHandler();
        Message msg = new Message();
        msg.what = MyHandler.TASK_FINISHED;
        handler.sendMessage(msg);
    }

在你的Handler课程中:

public class MyHandlerHandler extends Handler {
            public static final int TASK_FINISHED = 2;
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {

        case TASK_FINISHED:
            new MyAsyncTask().execute();
            break;
        }
    }
}

答案 5 :(得分:0)

而不是将第2行放在getIt中,将其放在onPostExecute中,如下所示:

public void getit(View v)

    {
        new getdata().execute("http://10.0.2.2/geturls.php");
    }



   @Override
    protected void onPostExecute() {
      // line 2 
   }