OkHttp的入队方法是否实现了AsyncTaskLoader?

时间:2018-01-01 16:34:12

标签: android okhttp asynctaskloader

我对android编程很新。我已经编写了一个使用OkHttp库执行API查询的代码。

我的问题是,一旦OkHttp的排队过程开始,并且用户立即旋转手机,从而破坏并重新启动活动,这会导致第二次排队过程发生,从而导致代码执行2 OkHttp Api查询并行?

我知道如果我们将httpUrlConnections与AsyncTask(而不是OkHttp)一起使用,这是一个已知问题。我们可以通过使用AsyncTaskLoader绕过它,它与MainActivity具有不同的生命周期。但我只是想知道OkHttp也会考虑到这一点。

谢谢!如果这对我有帮助,我的代码示例如下所示。

private void performApiCall(String url) {
    mLoadingPb.setVisibility(View.VISIBLE);
    // is network available?
    if (NetworkUtility.isNetworkAvailable(MainActivity.this)) {
        // create new OkHttp client
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).build(); // building the request
        Call call = client.newCall(request);


        // Asynchronous task
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                alertUserAboutError();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mLoadingPb.setVisibility(View.INVISIBLE);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d(TAG, "OkHttp, onResponse received");
                // perform data download
                if (response.isSuccessful()) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mLoadingPb.setVisibility(View.INVISIBLE);
                        }
                    });

                    String jsonData = response.body().string(); // this is the raw data in json format
                    Log.v(TAG, jsonData);

                    try {
                        if (mMovieData == null) {
                            saveMovieData(jsonData);


                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    mCurrentPage++;
                                    setRecyclerView();
                                    Log.d(TAG, "OkHttpCall completed");
                                }
                            });
                        } else {
                            appendMovieData(jsonData);

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

                                    mCurrentPage++;
                                    updateRecyclerView();
                                    Log.d(TAG, "OkHttpCall completed");
                                }
                            });
                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e(TAG, "Exception caught: ", e);
                    }
                } else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mLoadingPb.setVisibility(View.INVISIBLE);
                        }
                    });

                    alertUserAboutError();
                }

            }
        });
    } else {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mLoadingPb.setVisibility(View.INVISIBLE);
            }
        });

        alertUserNetworkUnavailable();
    }
}

1 个答案:

答案 0 :(得分:2)

  

我的问题是,一旦OkHttp的入队过程开始,并且用户立即旋转手机,从而破坏并重新启动活动,这会导致第二次排队过程发生,从而导致代码执行2 OkHttp Api查询并行?

如果您的活动在创建时自动调用enqueue(),则为是。

  

我们可以使用AsyncTaskLoader绕过它,它与MainActivity有一个独立的生命周期。

请注意,体系结构组件对视图模型和LiveData的支持是Google目前解决加载器试图解决的问题的方向。