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

Network connection on main thread - alternative in this case?

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

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) 如果可能的话,我想要一个示例,而不仅仅是:"yes, it is possible" 或 "do XYZ" 因为我是 Android 的新手并且没有示例它没有帮助很多。

将网络强制到主线程总是一个坏主意

替换UI阻塞调用

client.newCall(request).execute();

使用异步调用

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

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

if I add doInBackground, on response... it will run after my onCreate and the color will not be set

在异步任务中?那你做错了什么。 Okhttp 不需要 Asynctask

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

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