排球要求太慢

时间:2016-01-03 00:31:56

标签: java android http android-volley

我的应用程序崩溃,因为当我设置适配器时,图像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();
        }
    }
}

2 个答案:

答案 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回调中执行所有相关任务。