java - 使用接口(interface)实现将线程结果返回给Fragment

标签 java android multithreading android-fragments interface

我有一个应用程序,可以在 fragment 内的 ListView 中显示新闻文章。 首次创建 fragment 时,我启动一个线程,通过 API 调用获取文章(故事)列表

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mContext =  getActivity();

        new GetStoriesThread(mContext,this).start();

Fragment 和 Thread 都实现相同的接口(interface),用于将数据从线程传递到 Fragment

public interface GetStoriesThreadInterface {
    public void onGetStoriesThreadResult(final ArrayList<Story> result);
}

Thread处理完成后,会调用接口(interface)方法,将数据传回调用Fragment。

问题

现在,当我通过以下代码在 fragment 中获得结果时:

    @Override
public void onGetStoriesThreadResult(final ArrayList<Story> result)
{
    if(result!=null)
    {
                mStoriesList.clear(); //mStoriesList is the list that i supply to the adapter of the ListView
                mStoriesList.addAll(result);
                adapter.notifyDataSetChanged(); //Exception here
    }
}

我得到以下异常:

04-28 18:03:58.432: E/ViewRootImpl(21513): com.says.news.Stories : Only the original thread that created a view hierarchy can touch its views.

我知道使用 getActivity().runOnUiThread(new Runnable... 可以解决问题,但我不明白为什么。有时 getActivity() 返回 null 和这是一个完全不同的问题。

提前致谢!!

最佳答案

您是否从工作线程中调用 onGetStoriesThreadResult() ?你不应该。考虑使用 AsyncTask<> 而不是裸露的 Thread ,重写 onPostExecute() 方法并从那里调用您的事件。

关于java - 使用接口(interface)实现将线程结果返回给Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23338290/

相关文章:

java - JComboBox 和 JButton(2 列)并保持 JComboBox 尽可能大?

java - 在获取数组中的重复数字时出现错误

java - 如何在 Java 中并发处理 Collection 中的元素

android - 使用 Async Http 下载数据后将数据发送到 Fragments

java - -Xss 和 -XX :ThreadStackSize? 有什么区别

c++ - 使用 GCC 和 OMP 在 C 中的特定线程顺序

java - DefaultTableModel addRow 方法添加格式为 : column_name = column_value instead of just column_value 的行

android - MvvmCross Android fragment 添加到后台堆栈

ruby-on-rails - Ruby on Rails 不是线程安全的是什么意思?

javascript - 如何找到导致 Android 中的 Cordova 应用程序崩溃的原因?