当前位置:  开发笔记 > 编程语言 > 正文

在后台线程中执行OkHttp网络操作

如何解决《在后台线程中执行OkHttp网络操作》经验,为你挑选了1个好方法。

我正在使用OKHttp对服务器执行Post请求,如下所示:

public class NetworkManager {
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    OkHttpClient client = new OkHttpClient();

    String post(String url, JSONObject json) throws IOException {
        try {
            JSONArray array = json.getJSONArray("d");
            RequestBody body = new FormEncodingBuilder()
                    .add("m", json.getString("m"))
                    .add("d", array.toString())
                    .build();
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Response response = client.newCall(request).execute();
            return response.body().string();
        } catch (JSONException jsone) {
            return "ERROR: " + jsone.getMessage();
        }
    }
}

并称之为:

NetworkManager manager = new NetworkManager();
String response = manager.post("http://www.example.com/api/", jsonObject);

当我尝试运行App时,它会在logcat中提示错误:

android.os.StrictMode
$ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)中的android.os.NetworkOnMainThreadException

参考SO中的其他问题,我添加了这个以覆盖策略:

if (android.os.Build.VERSION.SDK_INT > 9)
{
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
}

但我认为这是不健康的,我想把这些NetworkManager行动置于背景之下.我怎么能这样做?



1> BNK..:

由于OkHttp也支持异步方式,因此IMO可以参考以下GET请求示例,然后申请POST请求:

        OkHttpClient client = new OkHttpClient();
        // GET request
        Request request = new Request.Builder()
                .url("http://google.com")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                Log.e(LOG_TAG, e.toString());
            }
            @Override
            public void onResponse(Response response) throws IOException {
                Log.w(LOG_TAG, response.body().string());
                Log.i(LOG_TAG, response.toString());
            }
        });

希望能帮助到你!


如你所见,在`onResponse`里面你会这样做,如果你想更新UI或显示Toast,你还需要`mHandler = new Handler(Looper.getMainLooper());`.如果请求在另一个类(例如Utils.java)中,我认为你应该使用一个监听器接口
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有