我的应用程序崩溃,因为当我设置适配器时,图像ArrayList为空,我通过在解析我的JSON请求后立即发出一个Toast消息,并在初始化我的适配器后发送Toast消息,“second”得到打印首先在屏幕上和应用程序崩溃后,它是否与我的互联网有关?或者我错过了什么,这是我的代码,谢谢!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_page);
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mVolleySingleton = VolleySingleton.getInstance();
mRequestQueue = mVolleySingleton.getRequestQueue();
//First Toast message inside this method
sendAPIRequest();
//after you get the images
mCustomSwipeAdapter = new CustomSwipeAdapter(this, images);
//SECOND TOAST
Toast.makeText(getApplicationContext(), "Second", Toast.LENGTH_LONG).show();
mViewPager.setAdapter(mCustomSwipeAdapter);
mCustomSwipeAdapter.notifyDataSetChanged();
}
public void sendAPIRequest(){
String requestURL = "";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, requestURL, (String) null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
parseJSONResponse(response);
//FIRST TOAST : SHOULD BE CALLED FIRST
Toast.makeText(getApplicationContext(), "First", Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mRequestQueue.add(jsonObjectRequest);
}
public void parseJSONResponse(JSONObject response) {
if (response != null || response.length() != 0) {
try {
JSONObject GObject = response.getJSONObject("game");
String name = "N/A";
if (GObject.has("name") && !GObject.isNull("name")) { name = GObject.getString("name"); }
if (GObject.has("screenshots") && !GObject.isNull("screenshots")) {
JSONArray screenShotsArray = GObject.getJSONArray("screenshots");
for (int i = 0; i < screenShotsArray.length(); i++){
JSONObject screenshot = screenShotsArray.getJSONObject(i);
String screenshotURL = screenshot.getString("url");
images.add(screenshotURL);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
是否与我的互联网有关?或者我错过了什么......
两者。这是因为你有竞争条件。
据我所知,images
回调中异步填充onResponse
列表。基本上,当您的应用获得对其正在进行的API请求的响应时,就会发生这种情况。那将是至少毫秒,可能是几秒(或更长)。
但是你的应用程序是(所以你说)在刷卡适配器注册后很快崩溃,并且有证据表明images
列表尚未填充。
有三种可能性:
您发送的请求有问题导致API请求没有给您任何响应。 (假设,您可能认证不正确或其他。)
由于互联网连接速度,拥塞或远程服务器速度缓慢,API请求需要很长时间。
API请求耗时很短......但适配器注册速度更快。
如果(假设)您的请求出现问题,则需要解决此问题。但是其他两种情况都必须通过以下方式解决:
修改使用图像的代码(如果还没有图像),或者
在注册适配器之前修改代码以等待图像加载完成。
答案 1 :(得分:0)
请在onResponse回调中使用此代码:
//after you get the images
mCustomSwipeAdapter = new CustomSwipeAdapter(this, images);
//SECOND TOAST
Toast.makeText(getApplicationContext(), "Second", Toast.LENGTH_LONG).show();
mViewPager.setAdapter(mCustomSwipeAdapter);
mCustomSwipeAdapter.notifyDataSetChanged();
Volley在队列中添加您的请求,因此最好只在Response或Error回调中执行所有相关任务。