@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
asyntask.execute();
}
我正在从某些API读取数据。是否可以从doInBackground()
致电onPostExecute
?
我希望以递归方式(网络任务和UI中的更新)进行5次。提前谢谢。
答案 0 :(得分:2)
从AsyncTask
内部再次启动onPostExecute
是一个可怕的想法。如果您想以递归方式对网络调用以及UI更新进行5次递增,我建议您保留一个界面来跟踪AsyncTask
调用。
所以这是一个关于如何实现这种行为的例子。您可以像这样创建interface
。
public interface MyResponseListener {
void myResponseReceiver(String result);
}
现在您也在AsyncTask
课程中声明了界面。因此,AsyncTask
可能看起来像这样。
public class YourAsyncTask extends AsyncTask<Void, Void, String> {
// Declare an interface
public MyResponseListener myResponse;
// Now in your onPostExecute
@Override
protected void onPostExecute(final String result) {
// Send something back to the calling Activity like this to let it know the AsyncTask has finished.
myResponse.myResponseReceiver(result);
}
}
现在您需要实现您已在此interface
中创建的Activity
。您需要将界面的引用传递给您从AsyncTask
Activity
public class MainActivity extends Activity implements MyResponseListener {
// Your onCreate and other function goes here
// Declare an AsyncTask variable first
private YourAsyncTask mYourAsyncTask;
// Here's a function to start the AsyncTask
private startAsyncTask(){
mYourAsyncTask.myResponse = this;
// Now start the AsyncTask
mYourAsyncTask.execute();
}
// You need to implement the function of your interface
@Override
public void myResponseReceiver(String result) {
if(!result.equals("5")) {
// You need to keep track here how many times the AsyncTask has been executed.
startAsyncTask();
}
}
}
答案 1 :(得分:0)
在调用onPostExecute之前调用doInBackground()。
由于您无法在UI线程上执行网络任务,因此会创建AsyncTask。 AsyncTask在后台执行,在工作线程上执行网络任务。然后在后台任务完成后,调用onPostExecute(),使UI线程上的UI发生变化。
这应该有所帮助:https://developer.android.com/reference/android/os/AsyncTask.html
https://developer.android.com/training/basics/network-ops/index.html
答案 2 :(得分:0)
AsyncTask
类用于在后台执行某些工作并将结果发布到MainThread
,因此通常不可能,因为工作中正在完成的工作线程可能在MainThread
中无法使用,(例如NetworkOnMainThreadException
中进行网络时的MainThread
)。
我建议你创建一个工作数组并调用execute()
子类的AsyncTask
方法,它将序列化要在工作线程中完成的工作。