2017-03-03 38 views
1

我需要在服务器中的颜色,并将其设置为题材主线程上的网络连接 - 在这种情况下的替代方法?

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的新手,没有例子,它没有多大帮助。

+1

尝试使启动画面,并从闪屏获取颜色,然后开始您的主要活动 –

回答

2

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

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

+0

感谢您的回答!我想到了,为了获得颜色和意图设置我会尝试其他的东西,但如果他们不工作,我会这样做,因为如果用户不打开设置颜色的活动,它会是一个无关的数据。但是这是一个好主意。 –

+1

是的,我认为它比给用户带来不好的体验还好。如果您的服务器需要超过5秒的响应时间(如果用户处于不良/间歇性网络时很容易发生),他们将获得ANR屏幕。 https://developer.android.com/training/articles/perf-anr.html 如果颜色不经常改变,你也可以放一些逻辑来获得它并保存到共享的首选项 –

1

它总是一个坏主意,网络强制主线程

更换UI阻塞调用

client.newCall(request).execute(); 

与异步调用

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

检查怎么说的文档全部作品

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

在一个Asynctask?那么你做错了什么。 Okhttp不需要Asynctask

+0

谢谢你的答案!我会试试这个! –

+0

我注意到你在其他问题中有Volley。你会遇到与Okhttp完全相同的问题和回拨 –

+0

哦,是的,在我正在使用的一些活动中,以及在其他人中使用Okhttp ...这是错误的吗? –

相关问题