[英]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.