用android-Volley解决未来

时间:2018-01-28 17:18:38

标签: android android-volley future

我是android的初学者。 我有一个项目,我在API上为应用程序发出GET请求,我使用齐射来提出我的请求和未来。我的问题是,我的未来永远不会解决,我的应用程序被阻止。 首先,我知道为什么我的应用程序被阻止,因为我在主线程上使用get()方法,但我需要这样做,因为我需要结果来进行下一个请求所以我需要等待响应。我的问题是,我不知道为什么我的要求和我的未来永远不会解决。  这里是我主要活动的代码:

    private void populateSummoner(String region, String summonerName)throws JSONException {
    RequestFuture<JSONObject> summonerDataFutur;
    summonerDataFutur = requestData.requestSummonerData(region, summonerName);
    try {
        summoner = FactorySummoner.CreateSummoner(summonerDataFutur.get(3, TimeUnit.SECONDS));
    } catch (TimeoutException e) {
        Log.i(TAG,"Solving the summunerFuture timed Out "+ e.getMessage());
        e.printStackTrace();
    }catch (InterruptedException e){
        Log.i(TAG,"Solving the summunerFuture was interrupt "+ e.getMessage());
    }catch (ExecutionException e){
        Log.i(TAG,"Solving the summunerFuture leads to an error "+ e.getMessage());
    }

}

我已经创建了一个用于管理我的不同请求的类,它包含请求函数

public class RequestData {

private static final String TAG = "RequestData";
private RequestQueue queue;

public RequestData(Context context){
    queue = Volley.newRequestQueue(context);
    queue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<JsonObjectRequest>() {
        @Override
        public void onRequestFinished(Request<JsonObjectRequest> request) {
            Log.i(TAG,"fin d'une requete " + request.toString());
            try {
                Log.i(TAG, request.getBody().toString());
            } catch (AuthFailureError authFailureError) {
                authFailureError.printStackTrace();
            }
        }
    });
}


public RequestFuture<JSONObject> requestSummonerData(String region, String summonerName){
    Log.i(TAG,"Begin RequestData for summoner : "+summonerName+" on region : "+region);
    final StringBuilder builder = new StringBuilder();
    builder.append(Utils.HTTPS);
    builder.append(getRegionUrl(region));
    builder.append(Utils.REQUEST_SUMMONER);
    builder.append(summonerName);
    builder.append(Utils.API_KEY);
    Log.i(TAG, "url built : "+builder.toString());

    RequestFuture<JSONObject> future = RequestFuture.newFuture();
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(builder.toString(),null,future,future);

    queue.add(jsObjRequest);
    return future;
}

private String getRegionUrl(String region){
    String url="";
    if (Utils.HOST_ADDRESS.containsKey(region)){
        url = Utils.HOST_ADDRESS.get(region);
    }
    else{
        //todo implement exception
        Log.i(TAG, "no host address for this region");
    }
    Log.i(TAG,"Server address : "+url);
    return url;
}

}

正如您所看到的,我已经尝试在我的队列上实现onRequestFinished()以查看请求是否已完成且似乎没有。 我已经在互联网上搜索但从未找到一个好的解决方案,并且凌空文档不是很有帮助-_- 请帮帮我 !

1 个答案:

答案 0 :(得分:0)

  

我是android的初学者。

欢迎!

  

我的问题是,我的未来永远不会被解决,我的应用程序也会受阻。

“永远不会解决”是什么意思?

  

首先我知道为什么我的应用程序被阻止,因为我在主线程上使用get()方法,但我需要这样做,因为我需要结果来发出下一个请求所以我需要等待响应。

您不需要来执行此操作。您可以在显示微调器或其他UI以显示进度时发出第一个请求,然后在第一个请求完成时启动下一个请求。

  

我的问题是,我不知道为什么我的要求和我的未来永远不会解决。这里是我主要活动的代码:

再一次,“解决”是什么意思?您是否debugged your app查看正在抛出的错误或异常?