Java 使用volley库,在onResponse方法内部,ArrayList具有一些数据,但在onResponse方法外部,ArrayList为空
我在一个模型中执行网络操作,然后返回结果,但返回时arraylist大小为零,但在Java 使用volley库,在onResponse方法内部,ArrayList具有一些数据,但在onResponse方法外部,ArrayList为空,java,android,arraylist,Java,Android,Arraylist,我在一个模型中执行网络操作,然后返回结果,但返回时arraylist大小为零,但在onResponse方法中,arraylist大小不是零。如何解决这个问题 public class doInBackground { //i have initialized the arraylist here ArrayList<Contact> arrayList=new ArrayList<>();
onResponse
方法中,arraylist大小不是零。如何解决这个问题
public class doInBackground {
//i have initialized the arraylist here
ArrayList<Contact> arrayList=new ArrayList<>();
String url="http://192.168.10.3/volley/allUser.php";
private Context context;
public doInBackground(Context context){
this.context=context;
}
public ArrayList<Contact> getArrayList(){
JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(Request.Method.POST, url, null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for(int i=0;i<response.length();i++){
try {
JSONObject jsonObject=response.getJSONObject(i);
Contact contact=new Contact();
contact.setName(jsonObject.getString("name"));
contact.setUserName(jsonObject.getString("username"));
arrayList.add(contact);
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(context,e.toString(),Toast.LENGTH_LONG).show();
}
}
//outside the for loop the arraylist have data( i.e fetch from Mysql database)
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context,error.toString(),Toast.LENGTH_LONG).show();
}
});
Toast.makeText(context,arrayList.size()+"",Toast.LENGTH_LONG).show();
//using singleton design pattern to add the request to the queue MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);
// here the arraylist is empty
return arrayList;
}
}
公共类doInBackground{
//我已经在这里初始化了arraylist
ArrayList ArrayList=新的ArrayList();
字符串url=”http://192.168.10.3/volley/allUser.php";
私人语境;
公共doInBackground(上下文){
this.context=context;
}
公共ArrayList getArrayList(){
JsonArrayRequest JsonArrayRequest=新的JsonArrayRequest(Request.Method.POST,url,null,new Response.Listener()){
@凌驾
公共void onResponse(JSONArray响应){
对于(int i=0;i这是典型的不理解异步操作,您提供给Volley的侦听器正在等待响应,当响应从服务器端返回时,不会调用您的return
语句,而是立即调用。这意味着您的arrayList
只是空的(填充它的代码在响应返回后运行)。它必须是异步操作,因为若不是这样,用户的所有UI线程都将停止,并且您的应用程序将不会响应任何用户操作
所以要解决这个问题,您需要等待响应返回,然后在填充数组后调用下一个想要的流。好的方法是添加一些加载程序视图,在请求开始之前显示它,在请求结束后隐藏
也许是流量比较
电流:
- 截击请求开始
- 返回arrayList(空列表)
- 截击反应充满了arrayList
通缉流程:
- 显示加载器
- 截击请求开始
- 截击反应充满了arrayList
- 隐藏装载机
- 使用随时可用的arrayList响应后调用所需操作
编辑(关于加载器)
对于加载,可以使用任何视图(例如带有图像的简单视图),方法是使用视图属性,如可见性,因此当加载程序视图应可见时,只需调用loaderView.setVisibility(view.visible)
,当应隐藏时-loaderView.setVisibility(view.GONE)
为此,还可以使用一个现成的android库,如ContentLoadingProgressBar
ContentLoadingProgressBar的示例用法
首先将其添加到布局:
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/loader"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:visibility="gone" />
最后只需使用它,用于显示loader.show()
,隐藏loader.hide()
。回到要点-在请求之前显示,在响应侦听器中隐藏。你能给我一个loader的例子吗?@Arsalan我在关于loader的信息中扩展了答案。
ContentLoadingProgressBar loader = (ContentLoadingProgressBar)findViewById(R.id.loader);