【问题标题】:How to add a code to wait for response?如何添加代码以等待响应?
【发布时间】:2017-08-14 13:36:58
【问题描述】:

我想知道在转到 onPostExecute() 方法之前如何等待 servlet 的响应。

请提供解决方案。

编辑:编辑版本

Response responsed = null;

    @Override
    protected String doInBackground(String... strings) {
        ArrayList<Farm> farmSend= dbFarm.getAllFarms();

        String result = "";
        OkHttpClient client = new OkHttpClient();
        RequestBody postRequestBody = new FormBody.Builder()
                .add("farms", new Gson().toJson(farmSend))
                .add("dataToBeRetrieved", "getData")
                .build();

        Request request = new Request.Builder()
                .url(new ipconfig().getIp() + "MobileFarm")
                .post(postRequestBody)
                .build();

            try {
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        e.printStackTrace();
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

                        responsed = response;
                        Headers responHeaders = response.headers();
                        for (int i = 0, size = responHeaders.size(); i < size; i++) {
                            Log.i("response: ", responHeaders.name(i) + ": " + responHeaders.value(i));
                        }
                        Log.i("response body: ", response.body().toString());
                    }
                });
                result = responsed.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
        return result;
    }

编辑:这是我的 servlet 代码。

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int addCount = 0;
        int updateCount = 0;

        System.out.println("farmer input form mobile upload");
        ArrayList<Farmer> farmers = new Gson().fromJson(request.getParameter("farmers"), new TypeToken<List<Farmer>>() {
        }.getType());
        for (int a = 0; a < farmers.size(); a++) {
            if (a < new FarmerDAO().getListOfFarmers().size()) {
                if (new FarmerDAO().updateFarmer(farmers.get(a))) {
                    updateCount++;
                }
            } else if (new FarmerDAO().registerFarmer(farmers.get(a))) {
                addCount++;
            } else {
                System.out.println(farmers.get(a).getFarmerID() + " not added/updated");
            }
        }
        System.out.println("farmer input count updated: " + updateCount);
        System.out.println("farmer input count added: " + addCount);

        response.getWriter().write(new Gson().toJson("farmer input completed"));
    }

立即打印的唯一内容是“来自移动上传的农民输入”和“开始循环”。在收到任何响应之前,不会打印后续的打印行。

【问题讨论】:

  • 不确定您的意思?您正在发送请求并获得响应。你还想等什么?
  • @MuratK。我应该等待 servlet 响应。但我收到 null,因为 servlet 尚未完成其任务的运行。
  • 好吧,我想我明白你的意思了。看我的回答。

标签: java android servlets android-asynctask


【解决方案1】:

使用 okhttp 提供的这些回调:

client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException e) {

        }

        @Override
        public void onResponse(Response response) throws IOException {

        }
    });

【讨论】:

    【解决方案2】:

    您可以使用库本身中的Asynchronous Get,它基本上是Callback,只要有响应即可。

    来自他们的文档

    在工作线程上下载文件,并在响应可读时被回调。在响应标头准备好后进行回调。读取响应正文可能仍会阻塞。 OkHttp 目前不提供异步 API 来接收部分响应正文。

      private final OkHttpClient client = new OkHttpClient();
    
      public void run() throws Exception {
        Request request = new Request.Builder()
            .url("http://publicobject.com/helloworld.txt")
            .build();
    
        client.newCall(request).enqueue(new Callback() {
          @Override public void onFailure(Call call, IOException e) {
            e.printStackTrace();
          }
    
          @Override public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
    
            Headers responseHeaders = response.headers();
            for (int i = 0, size = responseHeaders.size(); i < size; i++) {
              System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
            }
    
            System.out.println(response.body().string());
          }
        });
      }
    

    来源:https://github.com/square/okhttp/wiki/Recipes

    【讨论】:

    • 03-22 20:47:54.964 20925-21675/com.example.josiah.bigassv2 E/AndroidRuntime:致命异常:AsyncTask #3 进程:com.example.josiah.bigassv2,PID:20925原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“okhttp3.ResponseBody okhttp3.Response.body()”
    • @RubySenpaii 你做了什么?使用您的更改编辑您的开篇帖子。
    猜你喜欢
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多