尝试使用Volley和GSON读取空数组

时间:2015-11-26 22:01:23

标签: android gson android-volley

我在我正在尝试制作的音乐播放器中使用Volley。

以下是我如何定义歌曲在我的音乐播放器中的含义。我有这个"歌曲对象"有一些属性

SongObject {

    public String albumArtURI;

    // Some other attributes 
}

要获取albumArtURI,我会对其进行查询。如果URI不存在,我会尝试从互联网上提取图像URL,但是我收到了这个错误:

  

尝试从空数组中读取

所以这里的代码是从互联网上获取图像网址并将其分配给歌曲对象

 if(songObject.albumArtURI != null){

                    // The URI exists, so we leave as is

                } else {

                    // The album art URI does not exist,
                    // so we try to pull an album art .jpg URL down from iTunes
                    ServiceHandler serviceHandler = new ServiceHandler(MainActivity.this);
                    serviceHandler.getJSON_URL();               

                    songObject.albumArtURI = serviceHandler.JSONObjectsList[0].artworkUrl30; 
                    // Throws error "Attempt to read from a null array"
                }

从上面的代码可以看出,这一行会引发错误

songObject.albumArtURI = serviceHandler.JSONObjectsList[0].artworkUrl30; 
// Gives error "Attempt to read from a null array"

但是,serviceHandler.JSONObjectsList[0].artworkUrl30不应该是空数组。

正如可以从后续类中的行看到的那样,通过使用打印陈述,所述变量不为空

Log.v("TAG",String.valueOf(JSONObjectsList[0].artworkUrl30)); 
// Prints http://is4.mzstatic.com/image/thumb/Music6/v4/68/b5/27/68b5273f-7044-8dbb-4ad1-82473837a136/source/30x30bb.jpg    

以下是班级本身:

public class ServiceHandler {

    Context ctx;
    SongInfo[] JSONObjectsList;
    String albumArtURI;
    String url = "https://itunes.apple.com/search?term=michael+jackson";

    public ServiceHandler(Context ctx){

        this.ctx = ctx;
    }

    public void getJSON_URL(){

        RequestQueue requestQueue = Volley.newRequestQueue(ctx);

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

                // If there is a response, do this
                if (response != null) {

                    // Get the number of JSON objects on the web-page
                    int resultCount = response.optInt("resultCount");

                    // If there is a JSON object on the web-page, do this
                    if (resultCount > 0) {

                        // Get a gson object
                        Gson gson = new Gson();

                        // Get a JSONArray from the results
                        JSONArray jsonArray = response.optJSONArray("results");

                        // If the array exists, do this
                        if (jsonArray != null) {

                            // Convert the JSONArray into a Java object array 
                            JSONObjectsList = gson.fromJson(jsonArray.toString(), SongInfo[].class);

                            // Prints http://is4.mzstatic.com/image/thumb/Music6/v4/68/b5/27/68b5273f-7044-8dbb-4ad1-82473837a136/source/30x30bb.jpg
                            Log.v("TAG",String.valueOf(JSONObjectsList[0].artworkUrl30));                                                          
                        }
                    }
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("LOG", error.toString());
            }
        });

        requestQueue.add(jsonObjectRequest);
    }

    public class SongInfo {

        // Some attributes

        public String artworkUrl30;

        // Some more attributes
    }
}

所以我认为这个问题与Volley的异步性质有关?

在尝试读取阵列之前,我已经准备好了#34;?#34;?

当Volley完成这件事时,阵列最终会被填充吗?

1 个答案:

答案 0 :(得分:0)

你的假设是正确的,这是因为异步。当Volley完成任务时,他们的数组将有数据(即调用onResponse方法并执行)。您可以使用界面从中获取数据。

定义界面

public interface MyInterface {
    public void myTask (SongInfo[] songInfo)
}

然后在getJSON_URL方法中使用interface作为参数

getJSON_URL (MyInterface myInterface) {
...
@Override
public void onResponse(JSONObject response) {
.....
myInterface.myTask(JSONObjectsList);
}

然后在你的主要班级

...
serviceHandler.getJSON_URL(new MyInterface);
@Override 
public void myTask (SongInfo[] songInfo) {
...
songObject.albumArtURI = serviceHandler.JSONObjectsList[0].artworkUrl30;
...
}
...