标签:android multithreading android-volley android-syncadapter
我已经搜索了很多关于这个,但找不到任何解决方案.我一直在使用Volley来处理我的网络通信.最近我决定使用SyncAdapter将我的数据同步到服务器.在onPerformSync()方法中,我以为我会使用Volley将数据发送到服务器,因为Volley很容易发出GET,POST请求.
问题 – SyncAdapter和Volley都使用自己独立的线程.因此,当我从onPerformSync()方法内部发起Volley请求时,SyncAdapter不会等待Volley请求完成并在收到Volley的onResponse()或onErrorResponse()回调之前完成同步.第一次调用成功返回后,我需要在SyncAdapter内进行进一步的网络调用.
示例代码 –
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
JsonObjectRequest jReq = new JsonObjectRequest(Method.POST, url, data,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i(TAG, "response = " + response.toString());
}
},
new Response.ErrorListener() {
@Override
public void one rrorResponse(VolleyError error) {
Log.e(TAG, "error = " + error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(jReq);
//onPerformSync() exits before request finished
}
问题 – 那么如何使SyncAdapter等到Volley收到网络响应?
解决方法:
发出同步截击请求.
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(URL, null, future, future);
requestQueue.add(request);
然后使用:
try {
JSONObject response = future.get(); // this will block (forever)
} catch (InterruptedException e) {
// exception handling
} catch (ExecutionException e) {
// exception handling
}
代码来自:Can I do a synchronous request with volley?
标签:android,multithreading,android-volley,android-syncadapter 来源: https://codeday.me/bug/20190628/1312447.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。