一点背景: 我的主要活动是在' onResume'连接到我的服务器询问信息。这工作正常。 当活动收到答案时,它会将数据加载到一个数组上,在完成加载数组后,它会调用一个' UpdateFragments'位于主要活动上。 这是......
public void updateFragments() {
List<Fragment> allFragments = getSupportFragmentManager().getFragments();
if (allFragments == null || allFragments.isEmpty())
return;
for (Fragment fragment : allFragments)
if (fragment.isVisible())
((UpdatableFragment) fragment).updateView();
}
每个片段都实现了updateView()过程...现在我只使用一个片段,这是我的适配器:
public class MainAdapter extends FragmentPagerAdapter {
MainAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return FragmentDevices.newInstance();
}
@Override
public int getCount() {
return 1;
}
}
现在到了一个怪异的部分......使用以下代码(我们现在在片段中)它只是工作,当运行时我有我的空白片段与字符串:
private TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.device_fragment, parent, false);
tv = (TextView) view.findViewById(R.id.room);
tv.setText("PRINT THIS");
return view;
}
如果我在updateView()过程中输入相同的代码并在onCreateView中调用它,它也可以工作:
@Override
public void updateView() {
tv.setText("PRINT THIS");
}
但是......这里我们有大毛茸茸但是......如果在异步任务结束时从MainActivity调用updateView,那么文本永远不会打印出来。 奇怪的是刚刚开始...如果我尝试调试代码..当我到达tv.setText指令时,应用程序就会死...没有任何错误。
02-07 16:48:18.015 1649-3024/? I/ActivityManager: Force stopping XXX appid=10185 user=0: from pid 23193
02-07 16:48:18.015 1649-3024/? I/ActivityManager: Killing 22729:XXX/u0a185 (adj 0): stop XXX
02-07 16:48:18.027 1649-3440/? I/WindowState: WIN DEATH: Window{8db1796 u0 XXX/XXX.MainActivity}
编辑: @nbokmans可能是对的?在MainActivity上:
@Override
public void onStart() {
super.onStart();
mDataManager = new DataManager(this);
}
,DataManager类是这样的: 构造:
public DataManager(MainActivity context) {
super(context);
mHandle = context;
...
}
异步任务调用此:
public void onNewData(JSONObject data) {
...
mHandle.updateFragments();
}
答案 0 :(得分:1)
您需要从UI线程调用mHandle.updateFragments()
。由于您已经将MainActivity
实例传递给DataManager的构造函数,因此您只需执行此操作即可在UI线程上运行代码:
public void onNewData(JSONObject data) {
mHandle.runOnUiThread(new Runnable() {
@Override
public void run() {
mHandle.updateFragments();
}
}
}
编辑:您可能还想选择在runOnUiThread块中实际包装updateFragments
代码:
public void updateFragments() {
runOnUiThread(new Runnable() {
@Override
public void run() {
List<Fragment> allFragments = getSupportFragmentManager().getFragments();
if (allFragments == null || allFragments.isEmpty())
return;
for (Fragment fragment : allFragments) {
if (fragment.isVisible())
((UpdatableFragment) fragment).updateView();
}
}
});
}
答案 1 :(得分:-1)
尝试在片段代码中创建一个像前一个方法一样的方法:
@Override
public void updateView() {
tv.setText("PRINT THIS");
}
并从你的&#34; onPostExecute&#34; AsyncTask的内容如下:
protected void onPostExecute() {
//Example of some fragment
Yourfragment frag = ((Yourfragment) getSupportFragmentManager().findFragmentByTag("Yourfragment"));
((Yourfragment)frag).updateView();
}
试试吧!