Android:AsyncTask未到达onPostExecute

Android:AsyncTask未到达onPostExecute,android,android-asynctask,countdownlatch,Android,Android Asynctask,Countdownlatch,我使用AsyncTask在我的Android库项目上避免networkonmainthreadexception,现在我要做的是获取要返回到变量的值,并在执行下一行代码之前等待它。我用倒计时锁来做这个 我执行请求和调用AsyncTask的方式写在下面。。所以我使用CountDownLatch在返回我想要返回的值之前等待响应 public MyObject getMyObject(){ final String url = "http://[myip]:8080/retrieve";

我使用AsyncTask在我的Android库项目上避免networkonmainthreadexception,现在我要做的是获取要返回到变量的值,并在执行下一行代码之前等待它。我用倒计时锁来做这个

我执行请求和调用AsyncTask的方式写在下面。。所以我使用CountDownLatch在返回我想要返回的值之前等待响应

public MyObject getMyObject(){

    final String url = "http://[myip]:8080/retrieve";

    try{
        Response response = executeRequest(url);
        final MyObject myObject = om.readValue(response.body().string(),
                new TypeReference<MyObject>() {
                });
        return myObject;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;

}



private Response executeRequest(String url){

    try {
      //Simplified please just ignore this..
      GenericAsyncParams genericAsyncParams = createParams(......);

      final CountDownLatch countDownLatch = new CountDownLatch(1);
      ResponseListener responseListener = new ResponseListener(countDownLatch);
      MyAsyncTask myAsyncTask = new AsyncTask(responseListener);
      myAsyncTask.execute(genericAsyncParams);
      countDownLatch.await();

      //get the response from the listener class.
      Response response = responseListener.getResponse();
      return response;
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    return null;
  }
现在这是我的任务 注意:requestProcessor是okHttp的包装类

public class MyAsynctask extends AsyncTask<GenericAsyncParams, Void, Response>{


    private static final String TAG = MyAsyncTask.class.getName();

    private ResponseListener listener;

    public MyAsynctask(ResponseListener listener) {
        this.listener = listener;
    }

    @Override
    protected Response doInBackground(GenericAsyncParams... genericAsyncParamses) {
        Response response = null;
        GenericAsyncParams genericAsyncParams = genericAsyncParamses[0];
        String url = genericAsyncParams.getUrl();
        String method = genericAsyncParams.getMethod();
        RequestProcessor requestProcessor = genericAsyncParams.getRequestProcessor();

        try {
            Request.Builder builder;
            if(method.equalsIgnoreCase("POST")){
                builder = new Request.Builder()
                        .post(genericAsyncParams.getRequestBody())
                        .url(url)
                        .headers(headers);
            } else  {
                builder = new Request.Builder()
                        .headers(headers)
                        .get()
                        .url(url);
            }
            final Request request = builder.build();
            response = requestProcessor.client().newCall(request).execute();
            Log.d(TAG, "returning okHttp response..");
            return response;
        } catch (Exception e){
            Log.e(TAG, String.format("ERROR.. %s", ExceptionUtils.getMessage(e)));
        }

        return response;
    }


    @Override
    protected void onPostExecute(Response response) {
        if(listener != null){
            Log.d(TAG, "Updating response : onPostExecute..");
            listener.setResponse(response);
        } else {
            super.onPostExecute(response);
        }
    }

}

NetworkOnMainException
提醒我们不要阻止主UI线程。但是,您仍然通过使用
countdownlock
等待响应来阻止它。由于
onPostExecute()
在主线程上运行,因此您已阻止它执行。在等待网络连接完成时,不能阻止主线程。相反,请允许
executeRequest()
返回,以便UI能够正确响应。

NetworkOnMainException
提醒我们不要阻止主UI线程。但是,您仍然通过使用
countdownlock
等待响应来阻止它。由于
onPostExecute()
在主线程上运行,因此您已阻止它执行。在等待网络连接完成时,不能阻止主线程。相反,请允许
executeRequest()
返回,以便UI能够正确响应。

什么类包含
executeRequest()
?它是整个项目中使用的Util类中的常见代码。请在代码中显示它,并显示如何调用它的示例。您是否希望有活动调用它?顺便说一下,这是一个库项目。是的,我猜某个活动或服务调用了
executeRequest()
。为了澄清这一点,您需要显示更多代码。请给出一个。什么类包含
executeRequest()
?它是整个项目中使用的Util类中的一个常见代码。请在代码中显示它,并显示如何调用它的示例。是否需要调用它的活动?顺便说一下,这是一个库项目。是的,我猜某个活动或服务调用了
executeRequest()
。为了澄清这一点,您需要显示更多代码。请给出一个例子。我认为这对我现在来说是有意义的,所以我必须重构我的代码,因为目前,它唯一的异步部分是我向应用程序项目公开的接口。其他组件(如网络调用)不是异步的,我等待服务(不是android服务,只是服务)上的每个返回值,我使用这些服务收集需要返回到我创建的API(我的库的用途)的数据。不管怎样,这对我帮助很大,我有很多重构工作要做。谢谢@Code学徒!我认为这对我现在来说是有意义的,所以我必须重构我的代码,因为目前,它唯一的异步部分是我向应用程序项目公开的接口。其他组件(如网络调用)不是异步的,我等待服务(不是android服务,只是服务)上的每个返回值,我使用这些服务收集需要返回到我创建的API(我的库的用途)的数据。不管怎样,这对我帮助很大,我有很多重构工作要做。谢谢@Code学徒!
public class MyAsynctask extends AsyncTask<GenericAsyncParams, Void, Response>{


    private static final String TAG = MyAsyncTask.class.getName();

    private ResponseListener listener;

    public MyAsynctask(ResponseListener listener) {
        this.listener = listener;
    }

    @Override
    protected Response doInBackground(GenericAsyncParams... genericAsyncParamses) {
        Response response = null;
        GenericAsyncParams genericAsyncParams = genericAsyncParamses[0];
        String url = genericAsyncParams.getUrl();
        String method = genericAsyncParams.getMethod();
        RequestProcessor requestProcessor = genericAsyncParams.getRequestProcessor();

        try {
            Request.Builder builder;
            if(method.equalsIgnoreCase("POST")){
                builder = new Request.Builder()
                        .post(genericAsyncParams.getRequestBody())
                        .url(url)
                        .headers(headers);
            } else  {
                builder = new Request.Builder()
                        .headers(headers)
                        .get()
                        .url(url);
            }
            final Request request = builder.build();
            response = requestProcessor.client().newCall(request).execute();
            Log.d(TAG, "returning okHttp response..");
            return response;
        } catch (Exception e){
            Log.e(TAG, String.format("ERROR.. %s", ExceptionUtils.getMessage(e)));
        }

        return response;
    }


    @Override
    protected void onPostExecute(Response response) {
        if(listener != null){
            Log.d(TAG, "Updating response : onPostExecute..");
            listener.setResponse(response);
        } else {
            super.onPostExecute(response);
        }
    }

}
07-10 23: 47:07.008 28409-28530/com.aaron.android.android.lib D/com.aaron.android.android.lib.api.tasks.MyAsyncTask: returning okHttp response..