OkHttp的enqueue方法是否实现了AsyncTaskLoader?

问题描述 投票:2回答:1

我对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();
    }
}
android okhttp asynctaskloader
1个回答
2
投票

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

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

我们可以通过使用AsyncTaskLoader绕过它,它与MainActivity具有不同的生命周期。

请注意,Architecture Components对视图模型和LiveData的支持是Google目前解决加载器试图解决的问题的方向。

© www.soinside.com 2019 - 2024. All rights reserved.