有没有办法在显示所有UI元素后调用片段内的方法?我现在遇到麻烦,试图找出片段生命周期中的哪个方法应该放入我的代码。基本上,我正在等待我的套接字上的一些输入,通过调用inStream.read(buffer)
inStream
是一个inputStream
和缓冲区已经初始化byte[]
。我的问题是,无论我是在onResume,onStart,onActivityCreated中调用它,此调用都会阻止UI完全显示(它总是等待,直到它在UI完全显示之前收到了一些内容)。是否有针对此的特定片段生命周期方法? (因此套接字有点在后台工作,只是等待输入而不是占用前台,因为收到的数据将用于填充片段UI中的一些文本框。)
答案 0 :(得分:2)
您正在阻止负责绘制UI组件的UI主线程,在AsyncTask
等单独的线程中打开并读取您的Socket答案 1 :(得分:0)
sockeqwe即将发布,你应该在一个单独的线程中执行该任务,以免阻止UI线程。
要回答标题中的问题,以防任何人因此而到达此处,可以使用全局布局侦听器在布局完成时获取回调。在onCreateView
中使用布局中的任何视图:
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// do whatever you need
// remove the layout listener if not needed anymore
removeOnGlobalLayoutListener(view, this);
}
});
这是一个用于删除布局侦听器的静态帮助器方法
public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener victim) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
removeLayoutListenerJB(v, victim);
} else removeLayoutListener(v, victim);
}
@SuppressWarnings("deprecation")
private static void removeLayoutListenerJB(View v, ViewTreeObserver.OnGlobalLayoutListener victim) {
v.getViewTreeObserver().removeGlobalOnLayoutListener(victim);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private static void removeLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener victim) {
v.getViewTreeObserver().removeOnGlobalLayoutListener(victim);
}