Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用volley库,在onResponse方法内部,ArrayList具有一些数据,但在onResponse方法外部,ArrayList为空_Java_Android_Arraylist - Fatal编程技术网

Java 使用volley库,在onResponse方法内部,ArrayList具有一些数据,但在onResponse方法外部,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<>();

我在一个模型中执行网络操作,然后返回结果,但返回时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);