【问题标题】:Volley , Wait for response to return wait until use flagVolley , 等待响应返回 等待直到使用标志
【发布时间】:2015-03-15 08:40:30
【问题描述】:

我必须响应截击请求的结果。但因为它是异步的。在我继续之前,我需要等待结果。如果我不这样做,我会得到空对象。

如何设置标志并等到标志关闭。

 categoryslashid = new JSONObject[Category_IDs.size()];//size of the list containing all categories   

    taskfinished = new boolean[Category_IDs.size()];

    //boolean is initialized to false
    //Request to category/{id} to get 
    for(int i= 0;i<Category_IDs.size();i++)
    {              makevolleyrequesforCategorySlashID(Const.URL_FULL_STOREURL+Const.URL_PRODUCT_GET_CATEGORY_ID,i);
    }
public void makevolleyrequesforCategorySlashID(URL,id)
{
//volley implementation
public void onResponseoverride
{
categoryslashid[i]=response;
taskfinished[i]=true;
}

}

现在我必须在任务中的所有布尔值都完成后继续。

public  boolean areAllTrue()
    {

        for(boolean b : taskfinished) if(!b) return false;
        return true;
    }

【问题讨论】:

  • 很不清楚你想要什么。请发布一些代码示例,并更具体地说明您要实现的目标和无效的目标。
  • 你为什么不在onResponseoverride处理你的东西?
  • 我会试试看,这是在 Asynctask 上调用的:doinBackground() 已经。那我就叫它 onCreate 吧?

标签: java android android-volley


【解决方案1】:

实现一个接口并在数据准备好时使用它进行回调。像这样的:

public interface OnDownloadTaskCompleted {
    public void onTaskCompleted(List<ofSomething> list,  boolean error, String message);
}

那么你应该将这个实例传递给你的请求并覆盖onTaskCompleted()

private void downloadData(){

        final DownloadUsingVolley downloader = new DownloadUsingVolley(getActivity());
        downloader.retrieveData(new OnDownloadTaskCompleted() {
            @Override
            public void onTaskCompleted(List<ofSomething> list, boolean error, String message) {
                //do something with your data
            }
        });
    }

我假设您有一个实现 volley 内容的类 (DownloadusingVolley),并且有一个方法调用它并自己发出请求 (retrieveData)。

retrieveData 可以这样实现:

private void retrieveData(String url, final OnDownloadTaskCompleted taskCompleted){
    final JsonObjectRequest request = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>(){
        @Override
        public void onResponse(JSONObject response) {
            try {
                //parse
                taskCompleted.onTaskCompleted(result,false,null);
            }catch (JSONException e){
                taskCompleted.onTaskCompleted(0,true,e.getMessage());
            }
        }
    },new Response.ErrorListener(){
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            taskCompleted.onTaskCompleted(0,true,volleyError.getMessage());
        }
    });
    //adding request into the queue
    ApplicationClass.getInstance().addToRequestQueue(request,"aTag");
}

在这里你可以找到一个关于 volley 的不错的教程: Asynchronous HTTP Requests in Android Using Volley

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2020-03-13
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多