我有一个异步任务从服务器加载图片网址。加载网址后,我将图像逐个加载到另一个异步任务中。 单击按钮,我启动第一个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线程允许的时间更长的时间。 可以有更清洁的方法来进行此检查。 感谢
答案 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
}