gpt4 book ai didi

java - 处理android volley中的并发

转载 作者:行者123 更新时间:2023-12-01 10:45:00 27 4
gpt4 key购买 nike

情况是这样的,我有 2 个类,一个用于我的 fragment 的类,一个用于获取我的对象的单例类。每次创建此 fragment 时,它都会要求我的单例使用 Volley 从我的服务器使用 JSON 创建对象。然而,这导致我的单例在完全创建之前返回对象。这意味着我的 fragment 将不显示任何内容,除非在某些情况下 HTTP 请求首先完成。 (我尝试记录,确实方法调用不按顺序)
有什么好的方法可以让我在所有 HTTP 请求完成后更新 View ? (我想将 fragment 的对象传递给我的工厂,并在 onResponse 中调用我的 fragment 的方法,但我想如果我需要我的工厂用于其他类,它会变得困惑?)

public class myFragment extends Fragment{
onCreate(){
...
UpdateUI();
}

private void updateUI(){
Factory factory = factory.get(getActivity());
things = pabrik.getThings();
...
}
}

public class Factory{
Factory factory;
List<Things> things;

private Factory(Context c){
things = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "10.0.2.2/...", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray arr = response.getJSONArray("user");
for (int i = 0; i < arr.length(); i++){
things.add(new Barang(arr.getJSONObject(i).getString("email"), i));
Log.d("GET", arr.getJSONObject(i).getString("email"));
}
}catch (JSONException e){
e.printStackTrace();
}

}
},
...
);
mRequestQ.add(request);
}

public static synchronized Factory get(Context c){
if(this.factory == null){
this.factory = new Factory(c);
}
return this.factory;
}

public List<Things> getThings(){
return this.Things;
}
}

最佳答案

volley 的主要用例是从主(事件)线程进行网络连接。因此,请在主线程的 onResponse 方法上执行您在单例中所做的任何操作。 Volley确保网络任务在单独的后台线程上运行,并在后台执行完毕后调用onResponse。

public class myFragment extends Fragment{
onCreate(){
...
UpdateUI();
}

private void updateUI(){
Factory factory = factory.get(getActivity());
things = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "10.0.2.2/...", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray arr = response.getJSONArray("user");
for (int i = 0; i < arr.length(); i++){
things.add(new Barang(arr.getJSONObject(i).getString("email"), i));
Log.d("GET", arr.getJSONObject(i).getString("email"));
//Update ListView or do something with the data
}
}catch (JSONException e){
e.printStackTrace();
}

}
},
...
);
mRequestQ.add(request);
...
}

}

PS:如果您想使用单例,则应该传递监听器接口(interface)并使用处理程序和循环程序。 Handler 在后台线程中执行任务,然后通过实现接口(interface)的对象更新主线程。 Volley 的目的是避免这些并发症。

关于java - 处理android volley中的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34237187/

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