2017-03-03 63 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 ...這是錯誤的嗎? –

相關問題