我希望有一个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));
}
答案 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()
)中启动所需的活动