Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 等待活动显示_Android_Multithreading_Wait - Fatal编程技术网

Android 等待活动显示

Android 等待活动显示,android,multithreading,wait,Android,Multithreading,Wait,目前,我有一个加载活动的按钮 该活动中有一个ListView,无论出于何种原因,加载都需要相当长的时间(不等待数据,数据已经在内存中)。问题是,当它呈现列表时,UI正在等待按钮被单击的位置,并且在列表完全加载之前不会更改屏幕 我想要的是,只在加载活动后显示列表,这样至少在他们按下按钮时会发生一些事情(响应UI很重要) 目前,我的解决方案是生成一个线程,等待50毫秒,然后为我的列表设置适配器(使用runOnUiThread)。当然,如果在某些手机上加载活动需要超过50毫秒,则必须加载整个列表才能再

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

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

我想要的是,只在加载活动后显示列表,这样至少在他们按下按钮时会发生一些事情(响应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会等待活动完成加载,但这不起作用。它仍然挂着。

您可以使用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);  

}  

您可以使用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);  

}  

作为第一个解决方案,我建议在已启动的活动中创建一个静态公共可运行变量,您可以在加载完成后执行该变量。够了吗?我不明白你要我做什么。“加载完成后可以执行的”。我的问题是,我不知道加载何时完成。我知道如何启动runnable,您可以在我发布的解决方案中看到这一点。我的问题是知道什么时候执行它,因为等待50毫秒感觉像是一个非常糟糕的解决方案。恐怕我不明白在代码中延迟到底是什么时候。是否必须等待getData()结束?还是加载后显示时间过长?我实际上没有抓住重点,可能是…:/@Beppi的当前代码有效。这只是一个糟糕的解决方案。getData不等待。等待时间是我设置适配器后listview呈现的时间。作为第一个解决方案,我建议在启动的活动中创建一个静态公共可运行变量,您可以在加载完成后执行该变量。够了吗?我不明白你要我做什么。“加载完成后可以执行的”。我的问题是,我不知道加载何时完成。我知道如何启动runnable,您可以在我发布的解决方案中看到这一点。我的问题是知道什么时候执行它,因为等待50毫秒感觉像是一个非常糟糕的解决方案。恐怕我不明白在代码中延迟到底是什么时候。是否必须等待getData()结束?还是加载后显示时间过长?我实际上没有抓住重点,可能是…:/@Beppi的当前代码有效。这只是一个糟糕的解决方案。getData不等待。等待的时间是我设置适配器后listview渲染的时间。我今天将对此进行一次尝试,并让您知道它是如何工作的。谢谢你的回答Hi peter,这似乎正好满足了我的需要。非常感谢你的回答。我很惊讶我在任何地方都找不到这个Google!快速提问:返回值表示什么?在什么情况下,您会返回true?最后一个问题:这通常是一个好的实践吗?空闲处理程序是否经常使用?返回true以保持空闲处理程序处于活动状态,返回false以将其删除。当ui线程要阻止等待更多消息时,queueIdle()将被触发。仅供参考。今天我来试一试,让你知道结果如何。谢谢你的回答Hi peter,这似乎正好满足了我的需要。非常感谢你的回答。我很惊讶我在任何地方都找不到这个Google!快速提问:返回值表示什么?在什么情况下,您会返回true?最后一个问题:这通常是一个好的实践吗?空闲处理程序是否经常使用?返回true以保持空闲处理程序处于活动状态,返回false以将其删除。当ui线程要阻止等待更多消息时,queueIdle()将被触发。仅供参考。