我想在应用程序启动时加载一些将被所有活动使用的数据。 我在应用程序的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...");
}
获取应用范围数据的最佳方法是什么,请记住,没有一项活动首先启动?
答案 0 :(得分:0)
是的,根据排球的默认行为,请求的唤醒通知(响应的传递)发布在主UI线程的Handler上。
因此,当UI线程被阻止时,将永远不会执行唤醒通知(也不会传递响应),并且您总是会超时。
答案 1 :(得分:0)
我最近碰到了这个问题,解决方法是不从主线程(UI)发出请求或处理它们,它总是抛出TimeoutException
。考虑创建AsyncTask
并从那里执行此请求。
您可以使用onPostExecute
回调与MainActivity进行通信。
https://developer.android.com/reference/android/os/AsyncTask.html