2015-01-23 2 views
1

모든 액티비티가 사용할 애플리케이션 시작시 데이터를로드하고 싶습니다. 응용 프로그램의 onCreate 메서드에서이 작업을 수행하고 어떤 활동이 표시되기 전에이 데이터를 다운로드하기를 원하기 때문에 RequestFuture를 사용하여 동기 요청을 시도합니다. 그러나 TimeoutException 항상 throw됩니다.Android Volley RequestFuture 항상 시간 초과

public void onCreate() { 
 

 
     super.onCreate(); 
 
     
 
     appRequestQueue = Volley.newRequestQueue(this); 
 

 
     RequestFuture<JSONArray> requestFuture = RequestFuture.newFuture(); 
 
     JsonArrayRequest request = new JsonArrayRequest(
 
       URL, 
 
       requestFuture, 
 
       requestFuture); 
 

 
     appRequestQueue.add(request); 
 

 
     try { 
 
      JSONArray jsonArray = requestFuture.get(90, TimeUnit.SECONDS); 
 
      
 
      // Do processing. Never gets here    
 

 

 
      Log.v("*******************", "Application initialized"); 
 
      
 
     } catch (JSONException je) { 
 

 
     } catch (InterruptedException ie) { 
 
     } catch (ExecutionException ee) { 
 
     } catch (TimeoutException te) { 
 
      // Always times out 
 
      Log.v("$$$$$$$$$$$$$$$$$$$$$$$$$", "It has timed out..."); 
 

 
     }

처음 시작되어 아무도 활동이 없다는 것을 염두에두고 응용 프로그램 전반의 데이터 유지를 얻을 수있는 가장 좋은 방법은 무엇입니까 ?

+0

문제를 확인할 수 있었습니까? – bks4line

+1

재시도 정책을 시도하고 기본 시간 초과 값을 늘리셨습니까? – Tasneem

답변

0

그래, 발리의 기본 동작에 따라 요청의 깨우기 알림 (응답 전달)은 기본 UI 스레드의 처리기에 게시됩니다.

UI 스레드가 차단되면 깨우기 알림이 실행되지 않으며 응답도 전달되지 않으며 항상 시간 초과가 발생합니다.

0

최근에이 문제가 발생했습니다. 해결책은 요청을하지 않거나 주 스레드 (UI)에서 처리하는 것입니다. 항상 TimeoutException을 던집니다. AsyncTask을 만들고 거기에서이 요청을 수행하십시오.

onPostExecute 콜백을 사용하여 MainActivity와 통신 할 수 있습니다.

https://developer.android.com/reference/android/os/AsyncTask.html