等待活动显示

时间:2016-12-21 17:23:39

标签: android multithreading wait

目前我有一个加载活动的按钮。

该活动中有一个ListView,无论出于何种原因需要相当长的时间来加载(不等待数据,数据已经在内存中)。问题在于,当它呈现列表时,UI正在等待单击按钮的位置,并且在列表完全加载之前不会更改屏幕。

我想要的是,只有在加载活动后才显示列表,因此,只要按下按钮,就会发生一些事情(响应式界面非常重要)。

目前,我解决此问题的方法是生成一个线程,等待50毫秒,然后为我的列表设置适配器(使用runOnUiThread)。当然,如果在某些手机上加载活动的时间超过50毫秒,那么它必须加载整个列表才能再次加载活动。

当前相关代码:

@Override
public void onPostResume() {
    super.onPostResume();
    new Thread(new Runnable() {
        @Override
        public void run() {
            final AdapterData data = getData();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    myAdapter = new MyAdapter(MyActivity.this, data);
                    lvMyList.setAdapter(myAdapter);
                }
            });
        }
    }).start();
}

我刚刚更改了代码中的变量名称,但这并不重要。这只是为了让你看到我的一般解决方案。

我觉得应该在活动完成创建时调用某种回调。我认为onPostResume等待活动完成加载,但这不起作用。它还挂着。

1 个答案:

答案 0 :(得分:4)

你可以使用IdleHandler

protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.xxx);  
    final AdapterData data = getData();
    IdleHandler handler = new IdleHandler() {  

        @Override  
        public boolean queueIdle() {  
            myAdapter = new MyAdapter(MyActivity.this, data);
            lvMyList.setAdapter(myAdapter);
            return false;  
        }   
    };  
    Looper.myQueue().addIdleHandler(handler);  

}