其他分享
首页 > 其他分享> > android – 使用Volley和Sync Adapter

android – 使用Volley和Sync Adapter

作者:互联网

我已经搜索了很多关于这个,但找不到任何解决方案.我一直在使用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