从异步任务更新片段

时间:2017-02-07 16:06:48

标签: android android-fragments

一点背景: 我的主要活动是在' 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();
}

2 个答案:

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

试试吧!