gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:12:37 28 4
gpt4 key购买 nike

我在一个模型中进行网络操作然后返回结果,但是当我返回它时数组列表大小为零但在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com