AsyncTask类的正确方法如何等待另一个AsyncTask类完成其进程

时间:2017-01-19 15:38:00

标签: java android android-asynctask

我正在做一个访问Web服务的应用程序,并且使用我从中获取的JSON,我创建了一个对象并在我的代码中使用它。即使我的应用程序正在运行,我也不知道它写得很好而且完美无缺。

我将解释我的内容,然后放入一些示例代码来演示...首先,我创建了一个带有EditText和Button的Activity,用户将在其中输入代码并单击按钮进行访问我的数据库并检查它是否存在。主要在这里:在我的按钮.OnClickListener我检查EditText上是否有东西,如果我有互联网连接< - (我从来没有遇到任何问题),之后我调用我的类RestClient从AsyncTask扩展,它在后台访问WebService并从中获取对象。只有之后这个我将从这个RestClient获得结果。我的解决方案是启动一个新的AsyncTask,它等待我的RestClient,然后启动进程来获取对象。

这是我的代码示例,我的restClient从我的webservice返回一个通用对象:

public class RestClient<t>  extends AsyncTask<String, String, String> {

private Class<t> tClass;
private t ObjReturn;

public RestClient(Class<t> tClass)
{
    this.tClass = tClass; 
}

public Object getObjectResponse(){
    return ObjetoDeRetorno;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected String doInBackground(String... OnlyTheURL) {
    String urlString = OnlyTheURL[0];
    String error = null;
    WebApiDeRetorno = new WebApiRetorno();
    try {
        Log.i("RestClient","Starting connection");

        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");

        connection.connect();

        String result = convertStreamToString(connection.getInputStream());

        connection.disconnect();

        JSONObject jsonObject = new JSONObject(result);

        String obj = jsonObject.get("returnObject").toString();

        Gson gson = new Gson();
        ObjReturn = gson.fromJson(obj, tClass);


    } catch (IOException | JSONException e) {
        e.printStackTrace();
        return error;
    }
    return null;
}

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

我的buttom功能:

buttonConfirmar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            restClient = new RestClient<>(MyObject.class);

            restClient.execute(getString(R.string.WebServiceURL));
            new WhenWebServiceConnectionFinished().execute();

        }
    });

在RestClient之后执行的另一个AsyncTask类,需要等待它完成:

private class WhenWebServiceConnectionFinished extends AsyncTask<String, Void, Boolean> {
    @Override
    protected void onPreExecute() {
        progressDialog.show();
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... params) {

        //THIS IS WHAT I DON'T KNOW IF IT'S OK TO DO:
        do {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } while (restClient.getStatus() != AsyncTask.Status.FINISHED);
        //WAITING THE restClient.getStatus CHANGE TO FINISHED WITH Thread.sleepS.

        if (checkWebApiRetorno()) {
            objectReturnFromWebApi = (MyObject) restClient.getObjectResponse();

            Intent intent = new Intent(thisActivity, NewActivity.class);
            startActivity(intent);
            finish();
            return true;
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean success) {
        if (progressDialog.isShowing())
            progressDialog.dismiss();

        if (!success)
            dialogBuilder.create().show();

        super.onPostExecute(success);
    }
}

2 个答案:

答案 0 :(得分:2)

将回调添加到第一个AsyncTask并仅在onPostExecute首先AsyncTask

点燃后运行第二个

这样的东西
public interface AsyncFinishedCallback{
    public void onAsyncFinished();
}

并在第一个AsyncTask做像这样的构造函数

public RestClient(Class<t> tClass, AsyncFinishedCallback callback)
{
    this.tClass = tClass; 
    this.callback = callback; //declare it somewhere as a field
}

而不是

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    if(callback!=null)
        callback.onAsyncFinished();
    }
}

比按钮功能

buttonConfirmar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {


        restClient = new RestClient<>(MyObject.class, new AsyncFinishedCallback(){
    @Override
    public void onAsyncFinished(){
            new WhenWebServiceConnectionFinished().execute();
    }
});

        restClient.execute(getString(R.string.WebServiceURL));

答案 1 :(得分:0)

试试这个:当你从第一个Async task使用AsyncTask<String, String, Boolean>

获得结果时开始另一项任务
    public class RestClient<t>  extends AsyncTask<String, String, Boolean> {

private Class<t> tClass;
private t ObjReturn;

public RestClient(Class<t> tClass)
{
    this.tClass = tClass; 
}

public Object getObjectResponse(){
    return ObjetoDeRetorno;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected Boolean doInBackground(String... OnlyTheURL) {
    String urlString = OnlyTheURL[0];
    String error = null;
    WebApiDeRetorno = new WebApiRetorno();
    try {
        Log.i("RestClient","Starting connection");

        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");

        connection.connect();

        String result = convertStreamToString(connection.getInputStream());

        connection.disconnect();

        JSONObject jsonObject = new JSONObject(result);

        String obj = jsonObject.get("returnObject").toString();

        Gson gson = new Gson();
        ObjReturn = gson.fromJson(obj, tClass);
        return true;

    } catch (IOException | JSONException e) {
        e.printStackTrace();
        return  false;;
    }
  return true;
}

@Override
protected void onPostExecute(Boolean result) {
    if (result) {
            //success occurs task finish
             new WhenWebServiceConnectionFinished().execute();
         } else {
                //error occurs 
            }
        }
    }
}
相关问题