我在我正在尝试制作的音乐播放器中使用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完成这件事时,阵列最终会被填充吗?
答案 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;
...
}
...