Android 主线程上的网络连接-在这种情况下是可选的吗?

Android 主线程上的网络连接-在这种情况下是可选的吗?,android,okhttp,networkonmainthread,Android,Okhttp,Networkonmainthread,我需要得到一个服务器的颜色,并设置为一个主题 setTheme(colorId); 它需要在onCreate()内部设置,并在开始工作时设置 我正在这样做: protected void onCreate(Bundle savedInstanceState) { getColor(); ... } public void getColor() { StrictMode.ThreadPolicy tp = StrictMode.Thr

我需要得到一个服务器的颜色,并设置为一个主题

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(),在响应…
时,它将在我的
onCreate()之后运行,并且不会设置颜色

我的问题是:

1) 这是唯一的办法吗

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


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

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

替换UI阻塞调用

client.newCall(request).execute();
使用异步调用

client.newCall(request).enqueue(new Callback() {
检查文档,了解所有这些是如何工作的

如果我加上doInBackground,在回应时。。。它将在我的onCreate之后运行,并且不会设置颜色


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

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


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

尝试创建启动屏幕并从启动屏幕获取颜色,然后开始您的主要活动。我注意到您在其他问题上有截击。你会在Okhttp和Callback上遇到完全相同的问题哦,是的,在一些活动中我使用截击,在其他的Okhttp中。。。错了吗?谢谢你的回答!我考虑过,为了获得颜色和设置的意图,我会尝试其他的事情,但如果他们不工作,我会这样做,因为这将是一个不相关的数据,我得到如果用户不打开活动设置颜色。但是这是一个好主意。是的,我认为这比给用户一个糟糕的体验要好。如果服务器的响应时间超过5秒(如果用户的网络很差/断断续续,则很容易发生这种情况),则会出现ANR屏幕。如果颜色不经常更改,您还可以使用一些逻辑一次性获取颜色并将其保存到共享prefs