在这种情况下,我有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:
如果要使用单例,则应传递一个侦听器接口并使用处理程序和循环程序。处理程序在后台线程中执行任务,然后通过实现接口的对象更新主线程。齐射的目的是避免这些并发症。

10-06 16:01