【问题标题】:Using a Loader in a Fragment causes a NullPointerException在 Fragment 中使用 Loader 会导致 NullPointerException
【发布时间】:2017-08-23 20:05:27
【问题描述】:

我在android.support.v4.app.Fragment 中使用android.support.v4.content.Loader,有时我得到一个

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.support.v4.content.Loader.abandon()”

这是我第一次使用装载机,我不能 100% 确定它们是如何工作的。 我还希望加载程序每分钟刷新一次数据,所以我使用一个处理程序并且可以运行每分钟调用loaderManager.restartLoader()。 (如果这不是你应该做的,我愿意接受更好的想法)

到目前为止,我将 Runnable 作为全局变量:

private Runnable mStatusChecker = new Runnable() {
    @Override
    public void run() {
            refresh();
    }
};

调用 refresh() 函数:

public void refresh() {
    if (MainActivity.isConnected) {
        loaderManager.restartLoader(LOADER_ID, null, this);
    }
}

那行代码 loaderManager.restartLoader 有时会抛出异常(尽管有时它会起作用)。

在OnCreateView我初始化加载器和处理程序

   View rootView = inflater.inflate(R.layout.layout_for_fragments, container, false);


    loaderManager = getLoaderManager();

    if (MainActivity.isConnected) {
        loaderManager.initLoader(LOADER_ID, null, this);
    }

    adapter = new CustomArrayAdapter(getActivity().getApplicationContext(), exchanges, R.color.colorPrimaryDark);

    listView = rootView.findViewById(R.id.list);


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Exchange exchange = exchanges.get(i);
            String url = exchange.getUrl();
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(browserIntent);

        }
    });

    listView.setAdapter(adapter);


    mHandler = new Handler();
    mHandler.postDelayed(mStatusChecker, refreshRate);


    setHasOptionsMenu(true);


    return rootView;

onCreateLoader 方法是

public Loader onCreateLoader(int i, Bundle bundle) {

    String[] strings = {QUADRIGA_BTC};

    if (isAdded()){
        return new BLoader(getActivity(), strings);
    }
    return null;
}

我有 4 个非常相似的片段,它们都有一个相似的加载器,这些片段由 tablayout 和 viewpager 管理。

【问题讨论】:

  • 不要从onCreateLoader()返回null。
  • 我尝试将 onCreateLoader() 更改为 public Loader onCreateLoader(int i, Bundle bundle) { String[] strings = {QUADRIGA_BTC}; return new BLoader(getActivity(), strings); } 但这会使事情变得更糟并抛出 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context .getApplicationContext()' 在空对象引用上
  • 你停止在某处发布 Runnable 了吗?实际上,您确定首先需要这样做吗?你的约会对象来自哪里? MainActivity.isConnected 字段是怎么回事?

标签: android android-fragments android-loader


【解决方案1】:

我想我找到了问题所在。从onStop() 中的Runnable 中删除回调似乎已经修复了它。我的改变:

@Override
public void onStop() {
    super.onStop();
    mHandler.removeCallbacks(mStatusChecker);
} 

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 2012-02-03
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多