当所有UI元素都可见时,在片段内调用方法

时间:2015-01-27 23:16:01

标签: java android sockets android-fragments

有没有办法在显示所有UI元素后调用片段内的方法?我现在遇到麻烦,试图找出片段生命周期中的哪个方法应该放入我的代码。基本上,我正在等待我的套接字上的一些输入,通过调用inStream.read(buffer) inStream是一个inputStream和缓冲区已经初始化byte[]。我的问题是,无论我是在onResume,onStart,onActivityCreated中调用它,此调用都会阻止UI完全显示(它总是等待,直到它在UI完全显示之前收到了一些内容)。是否有针对此的特定片段生命周期方法? (因此套接字有点在后台工作,只是等待输入而不是占用前台,因为收到的数据将用于填充片段UI中的一些文本框。)

2 个答案:

答案 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);
}