我有一个异步任务,从server.After加载图像urls加载urls,而不是通过另一个异步任务逐个加载图像。在单击一个按钮时,我启动了第一个异步任务
public void getit(View v)
{
new getdata().execute("http://10.0.2.2/geturls.php");
// line no 2
}在获得urls之后,我使用另一个异步任务来加载图像。如果我使用了一个boolean变量,我在onpostexecute中切换了这个变量,那么我如何才能知道图像url什么时候已经被加载,并且我可以在第2行调用第二个异步任务呢?
@Override
protected void onPostExecute() {
urlgot=true;
}然后,我必须在getit方法中的第2行使用一些重复的循环来检查这个变量urlgot的状态。但它可能会花费比UI线程所允许的更多的时间。有没有更干净的方法来做这项检查。谢谢
发布于 2013-12-05 21:34:52
我能想到两种解决方案:
1)创建一个执行所有操作(获取urls和下载所有图像)的AsyncTask。你就不会知道什么时候开始下载图片了。
2)从第一个AsyncTask的onPostExecute()开始下一个AsyncTask。
发布于 2013-12-05 21:34:30
在不破坏AsyncTask的目的的情况下,您将无法在//line no 2中完成下一项工作。如果您正在进行网络活动,则需要异步进行,因此这不是一种选择。
相反,在onPostExecute()中,您可以在您的活动中调用另一个方法,该方法执行您在//line no 2中应该执行的操作。这样做是安全的,因为onPostExecute()发生在UI线程上。
但根据您的设计,在onPostExecute中使用原始AysncTask执行所有//line no 2内容可能更有意义,因此您只有一个任务来完成所有工作。
发布于 2013-12-05 21:34:47
我在执行后使用一个自定义接口来做一些事情。
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);
}https://stackoverflow.com/questions/20401324
复制相似问题