繁体   English   中英

Android片段中的Volley请求队列(getApplicationContext可能会产生NullPointerException)

[英]Volley Request Queue in Android Fragment (getApplicationContext may produce NullPointerException)

我只想使用片段内的recyclerview从本地主机加载数据,但未显示任何内容,它说getApplicationContext可能会产生NullPointerException

错误在于

Volley.newRequestQueue(getActivity()。getApplicationContext())。add(stringRequest);

我在主要活动上尝试了代码,并且工作正常。

public class UpdateFragment extends Fragment {

private static final String URL = "http://192.168.1.32/CAGELCOII_APP/api.php";

RecyclerView recyclerView;
ItemAdapter adapter;

List<Item> itemList;

public UpdateFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_update, container, false);

    itemList = new ArrayList<>();
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    loadItem();

    adapter = new ItemAdapter(getActivity(), itemList);
    recyclerView.setAdapter(adapter);

    return view;
}

private void loadItem(){

    StringRequest stringRequest = new StringRequest(Request.Method.GET, URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    try {
                        JSONArray products = new JSONArray(response);

                        for(int i =0; i < products.length(); i++){
                            JSONObject productObject = products.getJSONObject(i);

                            int id = productObject.getInt("id");
                            String description = productObject.getString("description");
                            String agency = productObject.getString("agency");
                            String date = productObject.getString("date");
                            String time = productObject.getString("time");
                            String image = productObject.getString("image");

                            Item item = new Item(id, description, agency, date, time, image);
                            itemList.add(item);
                        }

                        adapter = new ItemAdapter(getActivity(), itemList);
                        recyclerView.setAdapter(adapter);


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });

    Volley.newRequestQueue(getActivity().getApplicationContext()).add(stringRequest);

}

}

您必须确保在调用getActivity()时将片段isAdded()否则将获得NullPointerException因为getActivity()返回托管片段的活动。

如果您始终希望使用应用程序上下文,由于其生命周期不短,您可以使用此静态函数在整个应用程序中检索它:

App.java

public class App extends Application {
    private static Context sAppContext;

    public void onCreate() {
        super.onCreate();
        sAppContext = this;
    }

    public static Context getContext() {
        return sAppContext;
    }
}

AndroidManifest.xml

...
    <application
        android:name=".App"
        ...>
    </application>

您可以在代码中将其用作:

Volley.newRequestQueue(App.getContext()).add(stringRequest);

请尝试此代码

RequestQueue mRequestQueue = Volley.newRequestQueue(getActivity());
       mRequestQueue.add(jsonObjReq);

有两种方法可以打排球:

首次使用应用控制器类

AppController

    public class AppController extends Application {

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

 private RequestQueue mRequestQueue;
 private ImageLoader mImageLoader;

 private static AppController mInstance;

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

public static synchronized AppController 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 ImageClass());
 }
 return this.mImageLoader;
 }

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

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

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

** ImageClass **

    public class ImageClass extends LruCache<String, Bitmap> implements
            ImageCache {
        public static int getDefaultLruCacheSize() {
            final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
            final int cacheSize = maxMemory / 8;

            return cacheSize;
        }

        public ImageClass() {
            this(getDefaultLruCacheSize());
        }

        public ImageClass(int sizeInKiloBytes) {
            super(sizeInKiloBytes);
        }

        @Override
        protected int sizeOf(String key, Bitmap value) {
            return value.getRowBytes() * value.getHeight() / 1024;
        }

        @Override
        public Bitmap getBitmap(String url) {
            return get(url);
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            put(url, bitmap);
        }
    }

表现

    <application
     android:allowBackup="true"
     android:name=".AppController"
     android:icon="@mipmap/ic_launcher"
     android:label="@string/app_name"
     android:roundIcon="@mipmap/ic_launcher_round"
     android:supportsRtl="true"
     android:theme="@style/AppTheme">

android:name =“。AppController”添加清单

主要活动

   String url = Global.BASE_URL + "api/";
    StringRequest jsonObjReq = new StringRequest(Request.Method.POST, url,
            new com.android.volley.Response.Listener<String>() {
                @Override
                public void onResponse(String response) {


                    Log.e(TAG, response.toString());
                }
            }, new com.android.volley.Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            //Error Log
            VolleyLog.d(TAG, "Error: " + error.getMessage());
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            //Pass the parameters to according to the API.
            Map<String, String> params = new HashMap<String, String>();
            params.put("API_HASH", "hasKey");
            Log.e(TAG, "splash paramsTest----" + params);

            return params;
        }
    };
  /*  ----Adding request to request queue----*/
    AppController.getInstance().addToRequestQueue(jsonObjReq, 
    GlobalString.cancel_login_api);

第二

RequestQueue mRequestQueue = Volley.newRequestQueue(getActivity());
        mRequestQueue.add(jsonObjReq);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM