【问题标题】:GetterAndSetter returns empty ArrayListGetterAndSetter 返回空的 ArrayList
【发布时间】:2018-06-19 13:23:18
【问题描述】:

我正在添加由 Volley 的 onRespond 方法中的回调方法返回的字符串。

我已经在 OnCreate 方法中初始化了 GetterAndSetter 方法。

这是我的代码:

onRespond(){
       ...
       AddtoList(CreateURL, new VolleyCallback() {
                @Override
                public void onSuccess(String result) {
                    getterAndSetter.addString(result);
                }
            });
       ....
}

我的 GetterAndSetter 类:

public class GetterAndSetter {
    ArrayList<String> strings = new ArrayList<>();

    public void addString(String string) {
        this.strings.add(string);
    }

    public ArrayList<String> getList(){
        return this.strings;
    }
}

我尝试通过我的另一个方法中的以下代码来获取添加到这个 getterandsetter 的 ArrayList 中的所有字符串:

void LoadImages(MainActivity mainActivity){
       ...
        List<String> details = getterAndSetter.getList();
        Log.d("gs", getterAndSetter.getList().toString());
       ...
}

如上所示,我尝试打印日志,但它打印“[]”(空字符串)。我在 Stackoverflow 上看到了很多答案,但无法解决我的问题。

更新:我正在添加更多代码,以便你们理解问题。

我的 OnCreate 方法:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    getterAndSetter = new GetterAndSetter();
    LoadImages(this);
}

加载图像:

private void LoadImages(MainActivity mainActivity) {
            StringRequest stringRequest = new StringRequest(URL, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    mView.dismiss();

                    Log.d("Respone", "onResponse: " + response);

                    //  Used to Get List of Images URLs
                    getResponse = ParseJSON(response);

                    List<String> urlList = getResponse.get(0);
                    List<String> titles = getResponse.get(1);
                    List<String> details = getterAndSetter.getList();

                    Log.d("gs", getterAndSetter.getList().toString());

                    for (String urls : urlList) {
                        Log.d("urls", urls);
                    }

                    for (String title : titles) {
                        Log.d("tts", title);
                    }

                    for (String dt : details) {
                        Log.d("dts", dt);
                    }


                }
            }, error -> {
                Log.d(TAG, "onErrorResponse: Error Occured...");
            });
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);
    }

ParseJSON 方法:

ArrayList<ArrayList<String>> ParseJSON(String URL) {
        try {
            JSONObject root = new JSONObject(URL);
            JSONObject photos = root.getJSONObject("photos");
            JSONArray photo = photos.getJSONArray("photo");

            ArrayList<String> listURLS = new ArrayList<>();
            ArrayList<String> Titles = new ArrayList<>();

            ArrayList<ArrayList<String>> result = new ArrayList<>();

            for (int i = 0; i < photo.length(); i++) {
                JSONObject photosJSONObject = photo.getJSONObject(i);
                String FarmID = photosJSONObject.getString("farm");
                String ServerID = photosJSONObject.getString("server");
                String ID = photosJSONObject.getString("id");
                String SecretID = photosJSONObject.getString("secret");
                String ImageTitle = photosJSONObject.getString("title");

                listURLS.add(i, CreatePhotoURL(FarmID, ServerID, ID, SecretID));
                Titles.add(i, ImageTitle);

                String CreateURL = "https://api.flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=" + API_Key + "&photo_id=" + ID + "&format=json&nojsoncallback=1";

                AddtoList(CreateURL, new VolleyCallback() {
                    @Override
                    public void onSuccess(String result) {
                        getterAndSetter.addString(result);
                    }
                });

                result.add(listURLS);
                result.add(Titles);
            }
            return result;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

AddtoList 方法:

public void AddtoList(String CreateURL, VolleyCallback volleyCallback) {
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        StringRequest stringRequest = new StringRequest(CreateURL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                JSONObject root;
                try {
                    root = new JSONObject(response);
                    JSONObject photo = root.getJSONObject("photo");

                    String username = photo.getJSONObject("owner").getString("username");
                    String DateTaken = photo.getJSONObject("dates").getString("taken");
                    String Views = photo.getString("views");

                    String str = "Date Taken : " + DateTaken + "\n" + "Views : " + Views + "\n" + "User Name : " + username + "\n";

                    volleyCallback.onSuccess(str);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d(TAG, "onErrorResponse: " + error.toString());
            }
        });
        requestQueue.add(stringRequest);
    }

我的回调

public interface VolleyCallback {
        void onSuccess(String result);
    }

【问题讨论】:

  • 您没有向列表中添加任何内容,您还期望它返回什么?
  • 可能列表 为空...
  • 你有没有在onSuccess(String result)方法中输入log来获取result的值
  • 我正在通过回调从 onSuccess() 方法中添加值
  • @AviPatel 在您发布的代码中未调用,因此您实际上并未添加值。

标签: java android arraylist android-volley getter-setter


【解决方案1】:

问题是您试图在 Volley 调用回调之前打印列表。

您解析一个 Json 并为每个元素发出一个新请求。解析 Json 后打印列表,它是空的,因为您在打印列表时没有结束调用。

你需要等到你从循环内部开始的所有请求都结束了。

【讨论】:

  • 我有一个疑问。我通过打印日志获取字符串,在我的 getter 和 setter 中。如果您的建议有效,那么 getterAndSetter 中的日志是否也为空?
  • 不,如果您在 addString 方法中记录值,它们不应为空
  • 我怎样才能访问它们,这样我就不会得到它是空的?我也试过制作url的arraylist,然后一一传递,也是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多