Android Volley RequestFuture总是超时

时间:2015-01-23 18:48:38

标签: android android-volley

我想在应用程序启动时加载一些将被所有活动使用的数据。 我在应用程序的onCreate方法中执行此操作,因为我希望在显示任何活动之前下载此数据,我尝试使用RequestFuture发出同步请求。但是,总是抛出TimeoutException。

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...");

        }

获取应用范围数据的最佳方法是什么,请记住,没有一项活动首先启动?

2 个答案:

答案 0 :(得分:0)

是的,根据排球的默认行为,请求的唤醒通知(响应的传递)发布在主UI线程的Handler上。

因此,当UI线程被阻止时,将永远不会执行唤醒通知(也不会传递响应),并且您总是会超时。

答案 1 :(得分:0)

我最近碰到了这个问题,解决方法是不从主线程(UI)发出请求或处理它们,它总是抛出TimeoutException。考虑创建AsyncTask并从那里执行此请求。

您可以使用onPostExecute回调与MainActivity进行通信。

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