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()
)
有什么解决方案吗?有几种可能性:
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机,这都无关紧要。