Java 是否可以从onPostExecute调用doInBackground?
我正在从一些API读取数据。是否可以从Java 是否可以从onPostExecute调用doInBackground?,java,android,android-asynctask,Java,Android,Android Asynctask,我正在从一些API读取数据。是否可以从onPostExecute调用doInBackground() 我想像(网络任务和UI中的更新)一样递归地做5次。提前感谢。doInBackground()在调用onPostExecute之前被调用 由于无法在UI线程上执行网络任务,因此将创建一个异步任务。 异步任务在后台执行,在工作线程上执行网络任务。然后在后台任务完成后,调用onPostExecute(),在UI线程上进行UI更改 这将有助于: 异步任务类用于在后台执行一些工作,并将结果发布到主线程,因
onPostExecute
调用doInBackground()
我想像(网络任务和UI中的更新)一样递归地做5次。提前感谢。doInBackground()在调用onPostExecute之前被调用
由于无法在UI线程上执行网络任务,因此将创建一个异步任务。
异步任务在后台执行,在工作线程上执行网络任务。然后在后台任务完成后,调用onPostExecute(),在UI线程上进行UI更改
这将有助于:
异步任务
类用于在后台执行一些工作,并将结果发布到主线程
,因此它通常是不可能的,因为在工作线程中执行的工作在主线程
中可能无法执行,(如在MainThread
中进行联网时出现的NetworkOnMainThreadException
)。
我建议您创建一个作业数组,并调用execute()异步任务子类的方法,它将序列化要在工作线程中完成的作业。从onPostExecute
内部再次启动异步任务
是一个可怕的主意。由于您希望在UI更新的同时递归5次网络调用,我建议您保持用于跟踪AsyncTask
调用的接口
下面是一个关于如何实现行为的示例。您可以创建这样的接口
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
asyntask.execute();
}
现在您也在AsyncTask
类中声明了接口
public interface MyResponseListener {
void myResponseReceiver(String result);
}
为什么要这样做?doInBackground被执行以执行网络任务,onPostExecute在doInBackground之后执行以在doInBackground完成后进行UI更改我希望像(网络任务和UI中的更新)一样递归执行5次从onPostexecute调用doInbackground是否正确。@ArjunIssar,@masked Man您不能进行递归调用。创建不同的asynctask。您必须让asynctask完成,然后触发另一个,如果问题解决,请标记问题的答案。很好的解释谢谢@Reaz Murshed
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);
}
}
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();
}
}
}