【问题标题】:How to solve error : null in volley library?如何解决错误:凌空库中的空值?
【发布时间】:2015-08-08 11:58:26
【问题描述】:

在我的项目中,我使用 volley 库从服务器获取数据(文本和图像)并在 RecyclerView 中显示数据。问题是我发送的所有请求(POST)都没有响应并且错误:null(error.getMessage()为null)。我已经搜索了两天,但没有找到任何解决方案。

这是我的凌空单例课:

import android.app.Application;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

public class HttpController extends Application {

public static final String TAG = HttpController.class
        .getSimpleName();

private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;

private static HttpController mInstance;

@Override
public void onCreate() {
    super.onCreate();
    mInstance = this;
}

public static synchronized HttpController getInstance() {
    return mInstance;
}

public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }
    return mRequestQueue;
}

public ImageLoader getImageLoader() {
    getRequestQueue();
    if (mImageLoader == null) {
        mImageLoader = new ImageLoader(this.mRequestQueue,
                new LruBitmapCache());
    }
    return this.mImageLoader;
}

public <T> void addToRequestQueue(Request<T> req, String tag) {
    // set the default tag if tag is empty
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
    getRequestQueue().add(req);
}

public <T> void addToRequestQueue(Request<T> req) {
    req.setTag(TAG);
    getRequestQueue().add(req);
}

public void cancelPendingRequests(Object tag) {
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(tag);
    }
}

}

我正在使用此代码发送请求:

StringRequest data = new StringRequest(Request.Method.POST,
                "http://odishasamaya.com/news/api/get_category_posts/", new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d(TAG, "News request Response : " + response);
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    if (jsonObject.getString("status").equalsIgnoreCase("ok"))
                        adapter.setNewsList(getNewsData(jsonObject.getJSONArray("posts"), progressBar, news));

                    else
                        Log.e("tabs name", "array is null");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Request Error: " + error.getMessage());
                Toast.makeText(getActivity(),
                        error.getMessage(), Toast.LENGTH_LONG).show();
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {

                Map<String, String> params = new HashMap<>();

                params.put("id", id.get(getArguments().getInt("position")));
                Log.d("params are :", "" + params);

                return params;

            }
        };
        //HttpController.getInstance().cancelPendingRequests(tag_json_req);
        HttpController.getInstance().addToRequestQueue(data, tag_json_req);

我找不到问题所在。请帮我解决这个问题,或者我可以将任何其他库用于 http 请求,请告诉我。我需要尽快完成这件事。提前致谢。

【问题讨论】:

  • 你是否在清单文件的 标记中添加 HttpController 作为应用程序名称?
  • 我不知道。你能在答案中发布吗?
  • 在您的清单文件中,应用程序标签是否包含此 ?
  • 是的,我已经这样做了。

标签: android httprequest android-recyclerview android-volley


【解决方案1】:

我遇到了同样的错误,经过反复试验,在调用队列之前我不允许缓存,添加以下行:

data.setShouldCache(false);

HttpController.getInstance().addToRequestQueue(data, tag_json_req);

所以队列以空/不工作的缓存开始。像魅力一样工作。

【讨论】:

    【解决方案2】:

    尝试使用请求和检查添加 getHeaders() 方法,,,它只是一个成功和试验......

    这可能是服务器在请求时找不到 请求内容类型

    .. 试试

    pulic void doRequest(){
    StringRequest data = new StringRequest(Request.Method.POST,
            "http://odishasamaya.com/news/api/get_category_posts/", new      Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, "News request Response : " + response);
            try {
                JSONObject jsonObject = new JSONObject(response);
                if (jsonObject.getString("status").equalsIgnoreCase("ok"))
                    adapter.setNewsList(getNewsData(jsonObject.getJSONArray("posts"), progressBar, news));
    
                else
                    Log.e("tabs name", "array is null");
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Request Error: " + error.getMessage());
            Toast.makeText(getActivity(),
                    error.getMessage(), Toast.LENGTH_LONG).show();
            if(error.getMessage()==null)
            doRequest();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
    
            Map<String, String> params = new HashMap<>();
    
            params.put("id", id.get(getArguments().getInt("position")));
            Log.d("params are :", "" + params);
    
            return params;
    
        }
    
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String,String> params = new HashMap<>();
                params.put("Content-Type","application/x-www-form-urlencoded");
                return params;
            }
    };
    //HttpController.getInstance().cancelPendingRequests(tag_json_req);
    HttpController.getInstance().addToRequestQueue(data, tag_json_req);
    }
    

    【讨论】:

      【解决方案3】:

      我已找到解决此问题的方法。如果其他人将来需要它,我会在这里发布。

      pulic void doRequest(){
      StringRequest data = new StringRequest(Request.Method.POST,
                  "http://odishasamaya.com/news/api/get_category_posts/", new Response.Listener<String>() {
              @Override
              public void onResponse(String response) {
                  Log.d(TAG, "News request Response : " + response);
                  try {
                      JSONObject jsonObject = new JSONObject(response);
                      if (jsonObject.getString("status").equalsIgnoreCase("ok"))
                          adapter.setNewsList(getNewsData(jsonObject.getJSONArray("posts"), progressBar, news));
      
                      else
                          Log.e("tabs name", "array is null");
                  } catch (JSONException e) {
                      e.printStackTrace();
                  }
              }
          }, new Response.ErrorListener() {
              @Override
              public void onErrorResponse(VolleyError error) {
                  Log.e(TAG, "Request Error: " + error.getMessage());
                  Toast.makeText(getActivity(),
                          error.getMessage(), Toast.LENGTH_LONG).show();
                  if(error.getMessage()==null)
                  doRequest();
              }
          }) {
              @Override
              protected Map<String, String> getParams() throws AuthFailureError {
      
                  Map<String, String> params = new HashMap<>();
      
                  params.put("id", id.get(getArguments().getInt("position")));
                  Log.d("params are :", "" + params);
      
                  return params;
      
              }
          };
          //HttpController.getInstance().cancelPendingRequests(tag_json_req);
          HttpController.getInstance().addToRequestQueue(data, tag_json_req);
          }
      

      在上面的代码中,我创建了一个添加请求的方法,在错误响应中,我正在检查 error = null 然后再次添加请求。

      我知道这不是正确的方法,但使用此代码应用程序不会崩溃,但需要一些时间一次又一次地请求,直到请求不成功。

      因此,如果有人找到更好的解决方案,请在此处发布。 谢谢:)

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2013-06-28
        • 2012-03-20
        相关资源
        最近更新 更多