在这种情况下,我有2个类,一个用于我的片段的类,一个用于获取对象的单例。每次创建此片段时,它将要求我的单身人士使用Volley从服务器使用JSON创建对象。但是,这导致我的单例在完全创建对象之前就返回了对象。这意味着我的片段将不显示任何内容,除非在某些情况下HTTP请求首先完成。 (我尝试记录日志,实际上方法调用不正确)
有什么好的方法,以便在所有HTTP请求完成后可以更新视图? (我想将片段的对象传递给我的Factory,并在onResponse中调用我的片段的方法,但是如果我需要将Factory用于其他类,我想它会变得凌乱吗?)
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;
}
}
最佳答案
齐射的主要用例是从主(事件)线程进行联网。因此,您可以在主线程中的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:
如果要使用单例,则应传递一个侦听器接口并使用处理程序和循环程序。处理程序在后台线程中执行任务,然后通过实现接口的对象更新主线程。齐射的目的是避免这些并发症。