当前位置: 首页 > 知识库问答 >
问题:

从异步任务更新片段

訾渝
2023-03-14

一个小背景:我的主要活动时,“在简历上”连接到我的服务器要求信息。这是正确的。当活动接收到答案时,它将数据加载到数组上,在加载完数组后,它调用位于主活动上的“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();
}
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;
}
@Override
public void updateView() {
    tv.setText("PRINT THIS");
}
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}
@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();
}

共有1个答案

佟寒
2023-03-14

您需要从UI线程调用mhandle.updateFragments()。由于已经将MainActivity实例传递给DataManager的构造函数,因此只需这样做就可以在UI线程上运行代码:

public void onNewData(JSONObject data) {
    mHandle.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mHandle.updateFragments();
        }
    }
}

Edit:您可能还想选择将updateFragments代码实际包装在runOnUiThread块中:

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();
            }
        }
    });
}
 类似资料:
  • 我对如何从这个网站将大量模板JSON数据加载到我的应用程序中而不减慢主UI线程感到非常陌生和困惑。我可以将要从JSON响应加载的数据加载到我的recycler视图中,但单击底部显示该数据的导航选项卡需要很长时间才能加载到页面上。 我明白这是因为数据没有正确加载到后台线程,这就是我感到困惑的地方。 我希望能够从后台任务返回一个ArrayList,并将填充的ArrayList作为我的recyclerv

  • 主要内容:本节引言:,1.相关概念,2.AsyncTask全解析:,3.AsyncTask使用示例:,本节小结:本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称:应用程序,进程,线程,

  • 我想调用一个方法,从一个AsyncWork,从另一个类,我正在尝试这个 但我得到错误“。你能帮助我吗? 我的扩展活动:

  • 这可能是一个更巧妙的问题,但我在ViewComponent类中有以下方法 所以我的问题是我应该采取什么方法?让异步在那里与警告无关,还是有一个解决方案/修复这个警告?它对我的项目有那么大的影响吗? 谢了!

  • 8.2 使用异步任务 注意:本节所介绍的功能要求 vim 编译包括 +job 特性。 8.2.1 简单任务体验 前文说到,Vim 的异步任务主要是针对外部命令的。那我们就先以最简单最常见的系统命 令 ls 为例,其功能是列出当前目录下的文件,若在 Windows 操作系统下或可用 dir 命令代替。 首先请在 shell 中进入一个非空目录,便于实践,并在 shell 中执行如下命令: $ ls

  • 问题内容: 我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。 到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的: 这似乎可行,