Android 片段getActivity()返回null

Android 片段getActivity()返回null,android,android-fragments,android-lifecycle,Android,Android Fragments,Android Lifecycle,我正在尝试执行一项简单的任务,即通过调用以下代码在运行任务后更改视图可见性: private void runTask(){ Thread t = new Thread(new Runnable(){ @Override public void run(){ boolean status = task(); setVisibility(boolean); } }).start();

我正在尝试执行一项简单的任务,即通过调用以下代码在运行任务后更改视图可见性:

private void runTask(){
    Thread t = new Thread(new Runnable(){
        @Override
        public void run(){
            boolean status = task();
            setVisibility(boolean);  
        }
    }).start();
}

public void setVisibility(final boolean status) {
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (status) {
                    myView.setVisibility(View.VISIBLE);
                } else {
                    myView.setVisibility(View.GONE);
                }
            }
        });
}
问题是:我运行的任务需要root(这很好),此时我的活动失去焦点,所以我的片段被删除,我的
getActivity()
返回
null
。即使在root命令执行之后,我的活动也会被放在前面,但我的片段不会附加到它,也不会再附加到它

此外,我还尝试使用

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.activity = activity;
}
在我的片段中,我没有调用
getActivity().runOnUiThread()
,而是调用了
activity.runOnUiThread()
,但仍然不起作用(代码运行正常,它进入if/else语句,但在UI中没有任何更改。设置新可见性后,我还尝试调用
invalidate()

有什么解决方案吗?

有几种可能性:

  • 存储旗帜的状态。如果活动已附加,请对其进行更改,否则请将其存储。在onResume方法中设置可见性
  • 您可能可以使用
    View.post()
    ,就像使用
    Activity.runOnUiThread()
    一样

  • 当片段第一次附加到活动时,将调用
    onAttach
    。我想不会叫两次了。另外,试着重新表述你的问题,你做什么和想实现什么并不明显。例如,“根命令”是什么意思?是否以root用户身份执行任务?否则?是的,以root用户身份执行任务。这不是问题,因为命令运行良好。我正在尝试根据根任务的结果更新视图可见性,该任务返回一个布尔值,然后我在
    setVisibility
    方法中使用它。为什么要发布runnable来更改视图可见性?您的整个
    setVisibility
    代码可以简化为
    myView.setVisibility(状态?View.VISIBLE:View.GONE)因此,您不会遇到问题,因为您不需要活动。这比创建一个新的可运行对象并将其发布到UI线程消息队列要有效得多。因为我不在UI线程中,所以我在另一个线程中处于片段中,因此如果不在UI线程上运行,我无法更新视图。这就是为什么runOnUiThread,正如在上所看到的,似乎你缺乏对android基本概念的理解。当您在没有显式声明新线程(线程、asynctask等)的情况下进行操作时,您肯定处于应用程序UI线程的主线程上。调用
    myView.setVisibility()
    myView.runOnUiThread()
    ,您的
    Runnable:run()
    代码-所有这些都将在UI线程上执行。无论你是在活动中还是在零碎的工作中使用这些atm机,这都无关紧要。