2017-03-03 14 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"와 같은 예제가 필요합니다.

+1

스플래시 화면을 만들고 스플래시 화면에서 색상을 가져와 주 활동을 시작하십시오. –

답변

2

주 스레드에서 네트워크 요청을해서는 안됩니다. 대신 백그라운드 스레드의 데이터를 가져 오는 동안 진행률 표시 줄을 보여 주어야합니다.

but : 테마를 onCreate()에서 설정해야하므로 해당 지점에서보기가 부 풀리지 않으므로 진행 상황을 표시 할 수 없습니다. 더 나은 해결책은 이전 활동에서 서버의 색상을 가져 와서 as 및 intent 매개 변수로 전달하는 것입니다.

+0

답변 해 주셔서 감사합니다! 나는 그것에 대해 생각하고 색으로 설정하고 의도에 따라 설정해 보았습니다. 다른 것들을 시도 할 것이지만 작동하지 않으면 사용자가 색을 설정하는 활동을 열지 않으면 얻을 수있는 관련없는 데이터가 될 것이기 때문에이 작업을 수행 할 것입니다. . 하지만 좋은 생각입니다. –

+1

그래도 나는 사용자에게 나쁜 경험을주는 것보다 여전히 낫다고 생각합니다.서버가 응답하는 데 5 초 이상 (사용자가 열악한/간헐적 인 네트워크에있는 경우 쉽게 발생할 수 있음) 걸리면 ANR 화면이 표시됩니다. https://developer.android.com/training/articles/perf-anr.html 색상이 자주 바뀌지 않는 경우 로직을 한 번 가져 와서 공유 환경 설정에 저장할 수도 있습니다 –

1

항상 어떻게에 대한 설명서를 확인 비동기 호출

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

으로 전화

client.newCall(request).execute(); 

을 차단 UI를 교체 메인 스레드

에 네트워크를 강제로 나쁜 생각 모든 작품

응답시 doInBackground를 추가하면 onCreate와 색상이 설정되지 않고 실행됩니다.

Asynctask에서? 그러면 뭔가 잘못하고있는 것입니다. Okhttp에는 Asynctask가 필요하지 않습니다.

+0

답장을 보내 주셔서 감사합니다! 나는 이것을 시험해 볼 것이다! –

+0

다른 질문에서 볼리를 만난 것으로 나타났습니다. 당신은 Okhttp와 Callback과 똑같은 문제를 갖게 될 것입니다. –

+0

오, 예, 일부 활동에서 저는 발리 슛을 사용하고 있습니다. 다른 사람들은 Okhttp ... 잘못입니까? –