主线程上的网络连接 - 在这种情况下的替代方案?
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 参数传递。
我需要在服务器中获取一个颜色并将其设置为主题
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 参数传递。