我需要在服务器中获取颜色并将其设置为主题
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新手而没有例子它没有多大帮助。
答案 0 :(得分:2)
您不应该在主线程上发出任何网络请求。 相反,您应该在用户在后台线程中获取数据时向用户显示进度条。
但是:由于您必须在onCreate()中设置主题,这意味着您无法向用户显示任何进度,因为此时视图不会被夸大。一个更好的解决方案是从服务器上获取前一个活动的颜色,并将其作为as和intent参数传递。
答案 1 :(得分:1)
强制网络加入主线程
总是一个坏主意替换UI阻止调用
client.newCall(request).execute();
使用异步调用
client.newCall(request).enqueue(new Callback() {
查看有关所有工作原理的文档
如果我添加doInBackground,在响应...它将在我的onCreate之后运行并且颜色将不会被设置
在Asynctask中?然后你做错了什么。 Okhttp不需要Asynctask