【问题标题】:Activity consuming REST webservice using Volley library DOES NOT show layout loaded from XML (through setContentView())使用 Volley 库消耗 REST Web 服务的活动不显示从 XML 加载的布局(通过 setContentView())
【发布时间】:2023-03-09 14:50:01
【问题描述】:

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

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

(相关部分)代码如下。

问题在于,虽然从 REST API 下载数据,但使用 setContentView()(在 onCreate()之前 使用 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));
    } 

【问题讨论】:

  • 我认为这里的问题是因为您从 onCreate 阶段内的主线程调用 Thread.sleep(5000);
  • @AleksandrMedvedev 不,这只是我添加的一项检查,以确保只要使用 REST API,从 XML 加载布局实际上就会延迟。
  • 但是你为什么不在回调中开始你的活动呢?如果我没听错,您正在等待收到回复吗?
  • @once2go 没有具体原因。让我在删除Thread.sleep() 并将startActivity() 调用移动到onResponse() 回调后尝试运行它。

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


【解决方案1】:

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

首先 - 在onResume 阶段之前您看不到活动。因此,当您在 onCreate 阶段使线程休眠时,无法访问 onResume(这就是您看到空白屏幕的原因)。

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

【讨论】:

    【解决方案2】:

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

    我猜你正在尝试实现启动画面 功能,这个解决方案应该可以解决这个问题。

    【讨论】:

    • 是的,我正在尝试添加闪屏类型的功能。但是Thread.sleep() 只是我添加的一项检查,以确保只要使用 REST API,从 XML 加载/显示布局就会延迟。我很乐意摆脱线程的整个休眠状态。
    • 这个 rest api 调用是另一个线程,因此它不会延迟另一个活动的启动。但是是的,如果您启动 API 的 onResponse() 活动,那么启动将延迟到收到 api 响应为止。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2021-06-28
    • 2013-03-05
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多