是否可以从onPostExecute调用doInBackground?

时间:2016-10-01 11:44:18

标签: android android-asynctask

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    asyntask.execute();   
 }

我正在从某些API读取数据。是否可以从doInBackground()致电onPostExecute

我希望以递归方式(网络任务和UI中的更新)进行5次。提前谢谢。

3 个答案:

答案 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方法,它将序列化要在工作线程中完成的工作。