Activity 使用 Volley 库使用 REST 网络服务不显示从 XML 加载的布局(通过 setContentView())

Activity consuming REST webservice using Volley library DOES NOT show layout loaded from XML (through setContentView())

我想要一个 Activity,它使用 Volley 库使用 REST API,同时在屏幕上显示自定义布局(写在 XML 布局文件中)。

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

(相关部分)代码如下。

问题是数据是从REST下载的API,布局是从XML布局加载的使用 setContentView() 的文件(在 onCreate() 之前 使用 REST Web 服务)未显示在屏幕上,并且屏幕保持空白。然后过了一会儿, XML 中定义的布局瞬间显示出来,就像眨眼一样,然后下一个 activity 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));
    } 

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);

I'm guessing you are trying to achieve splash screen kind of functionality, this solution should work for that.

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

First - 您直到 onResume 阶段才看到 Activity。因此,当您让线程在 onCreate 阶段休眠时,无法访问 onResume(这就是您看到空白屏幕的原因)。

Second - 你不应该依靠计时来确定请求何时完成。相反,在回调方法中启动所需的 activity (Response.Listener<JSONObject> and/or Response.ErrorListener())