主线程上的网络连接 - 在这种情况下的替代方案?

时间:2017-03-03 08:07:36

标签: android okhttp networkonmainthread

我需要在服务器中获取颜色并将其设置为主题

setTheme(colorId);

需要在onCreate()内设置并在开始时才能正常工作。

我这样做:

    protected void onCreate(Bundle savedInstanceState) {

        getColor();
    ...
    }

public void getColor() {

        StrictMode.ThreadPolicy tp = StrictMode.ThreadPolicy.LAX; //force network on main thread
        StrictMode.setThreadPolicy(tp);

                    OkHttpClient client = new OkHttpClient();
                    okhttp3.Request request = new okhttp3.Request.Builder()
                            .url("http://myip/color.php")
                            .build();
                    try {
                        okhttp3.Response response = client.newCall(request).execute();

                        String color = response.body().string();
                        setTheme(color);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    }
}

所以,我在主线程上强制建立网络连接,因为如果我添加doInBackground(), on response...,它将在我的onCreate()之后运行,并且颜色将不会被设置。

我的问题是:

1)这是唯一的方法吗?

2)我可以在主线程上没有强制网络的情况下做事吗?

3)我想要一个例子,如果可能的话,不仅仅是:“是的,它是可能的”或“做XYZ”,因为我是Android新手而没​​有例子它没有多大帮助。

2 个答案:

答案 0 :(得分:2)

您不应该在主线程上发出任何网络请求。 相反,您应该在用户在后台线程中获取数据时向用户显示进度条。

但是:由于您必须在onCreate()中设置主题,这意味着您无法向用户显示任何进度,因为此时视图不会被夸大。一个更好的解决方案是从服务器上获取前一个活动的颜色,并将其作为as和intent参数传递。

答案 1 :(得分:1)

强制网络加入主线程

总是一个坏主意

替换UI阻止调用

client.newCall(request).execute();

使用异步调用

client.newCall(request).enqueue(new Callback() {

查看有关所有工作原理的文档

  

如果我添加doInBackground,在响应...它将在我的onCreate之后运行并且颜色将不会被设置

在Asynctask中?然后你做错了什么。 Okhttp不需要Asynctask