使用Volley库的活动消耗REST Web服务不显示从XML加载的布局(通过setContentView())

时间:2016-06-14 19:50:52

标签: android android-layout android-volley android-xml setcontentview

我希望有一个Activity使用Volley库来使用REST API,同时在屏幕上显示自定义布局(用XML布局文件编写)。

所以我写了一个Activity,在其onCreate()中像往常一样调用setContentView(R.layout.layout_file);之后的,它通过Volley库使用REST API(即构建Volley' RequestQueue对象,然后在其上调用requestQueueObject.add(requestObject)

代码的(相关部分)如下:

问题是从REST API下载数据时,使用setContentView()onCreate() <在XML布局文件中加载布局em>在使用REST Web服务之前)未显示在屏幕上,并且屏幕保持空白。然后,在那之后,XML中定义的布局会暂时显示,就像眨眼一样,然后开始下一个活动AnotherActivity

从下一个Activity中,如果我按下后退按钮,那么XML中的布局设置将显示在第一个Activity中。

如何解决此问题?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_first);

        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

        RequestQueue requestQueue = RequestQueueSingleton.getInstance(getApplicationContext()).getRequestQueue();
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        ...
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        ...
                    }
                });

        requestQueue.add(request);

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        startActivity(new Intent(this, AnotherActivity.class));
    } 

2 个答案:

答案 0 :(得分:1)

onCreate你让线程休眠5秒因此这个问题。您可以通过进行以下更改来解决问题:

替换此代码:

try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        startActivity(new Intent(this, AnotherActivity.class));

由:

new Handler().postDelayed(
                new Runnable() {
                    @Override
                    public void run() {
                        startActivity(new Intent(this, AnotherActivity.class));
                    }
                }, 5000);
  

我猜你正试图实现启动画面   功能,这个解决方案应该适用于此。

答案 1 :(得分:1)

您应该了解有关Acitivty生命周期和线程的更多信息。

首先 - 您不会在onResume阶段看到活动。因此,当您让线程在onCreate阶段内休眠时,无法联系到onResume(这就是您看到空白屏幕的原因)。

第二 - 您不应该依赖时间来确定请求何时完成。相反,在回调方法(Response.Listener<JSONObject>和/或Response.ErrorListener())中启动所需的活动