java - 使用 volley 库,在 onResponse 方法内,ArrayList 有一些数据,但在 OnResponse 方法外,arraylist 是空的

标签 java android arraylist

我在一个模型中进行网络操作然后返回结果,但是当我返回它时数组列表大小为零但在 onResponse 方法中数组列表大小不为零。如何解决?

      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;
                }


        }

最佳答案

典型的是不理解异步操作,您提供给 Volley 的监听器正在等待响应,并且您的 return 语句不是在响应从服务器端返回时被调用,而是被立即调用。这意味着您的 arrayList 只是空的(填充它的代码在响应返回后运行)。它必须是异步操作,因为如果不是这样,用户的所有 UI 线程都会停止,您的应用程序将不会响应任何用户操作。

因此,要解决此问题,您需要等到响应返回,然后在填充数组后调用下一个想要的流程。好的是添加一些加载器 View ,在请求开始前显示它并在请求结束后隐藏。

也许是一些流量比较。

当前流量:

  • 开始截击请求
  • 返回数组列表(空列表)
  • Volley 响应正在填充 arrayList

想要的流量:

  • 显示加载器
  • 开始截击请求
  • Volley 响应正在填充 arrayList
  • 隐藏装载机
  • 响应后调用需要的操作并准备好使用 arrayList

编辑(关于装载机)

通过使用VISIBILITY等 View 属性,可以使用任何 View (例如带有图像的简单 View )进行加载,因此当加载器 View 应该可见时,只需调用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" />

下一步在 Activity 中找到它:

ContentLoadingProgressBar loader = (ContentLoadingProgressBar)findViewById(R.id.loader);

最后使用它,用于显示 loader.show(),用于隐藏 loader.hide()。所以回到要点 - 在请求之前显示,隐藏在响应监听器中。

关于java - 使用 volley 库,在 onResponse 方法内,ArrayList 有一些数据,但在 OnResponse 方法外,arraylist 是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41907218/

相关文章:

android - 如何实现 SetOnItemClickListener FirebaseRecyclerViewAdapter

java - 在 ArrayList 中查找可被 3 整除的数字

java - 自定义异常不断给我 "Exception: Unknown exception"

java - gl.glScalef() 隐藏 gl.glDrawArrays() 绘图

java - Struts 2 post参数从Action A到Action B

android - onTouchEvent 中的 CoordinatorLayout NullPointerException

java - 如何使用静态成员泛化 Java 枚举?

android - 如何以不阻止滚动和点击它的子项目的方式在 Android ScrollView 中启用缩放?

java - 如何在 Java 中反转列表的 HashMap ?

Java ArrayList不同的对象相互扩展,如何了解我检索到的对象?