Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以从onPostExecute调用doInBackground?_Java_Android_Android Asynctask - Fatal编程技术网

Java 是否可以从onPostExecute调用doInBackground?

Java 是否可以从onPostExecute调用doInBackground?,java,android,android-asynctask,Java,Android,Android Asynctask,我正在从一些API读取数据。是否可以从onPostExecute调用doInBackground() 我想像(网络任务和UI中的更新)一样递归地做5次。提前感谢。doInBackground()在调用onPostExecute之前被调用 由于无法在UI线程上执行网络任务,因此将创建一个异步任务。 异步任务在后台执行,在工作线程上执行网络任务。然后在后台任务完成后,调用onPostExecute(),在UI线程上进行UI更改 这将有助于: 异步任务类用于在后台执行一些工作,并将结果发布到主线程,因

我正在从一些API读取数据。是否可以从
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();
        }
    }
}