为什么片段中的getContext()有时会返回null?

后卫:

为什么getContext()有时会返回null我将上下文传递LastNewsRVAdapter.java为参数。LayoutInflater.from(context)有时会崩溃。我在Play控制台上收到了一些崩溃报告。以下是崩溃报告。

java.lang.NullPointerException
com.example.adapters.LastNewsRVAdapter.<init>

java.lang.NullPointerException: 
at android.view.LayoutInflater.from (LayoutInflater.java:211)
at com.example.adapters.LastNewsRVAdapter.<init> (LastNewsRVAdapter.java)
at com.example.fragments.MainFragment$2.onFailure (MainFragment.java)
or                     .onResponse (MainFragment.java)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run 
(ExecutorCallAdapterFactory.java)
at android.os.Handler.handleCallback (Handler.java:808)
at android.os.Handler.dispatchMessage (Handler.java:103)
at android.os.Looper.loop (Looper.java:193)
at android.app.ActivityThread.main (ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative (Method.java)
at java.lang.reflect.Method.invoke (Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run 
(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:641)
at dalvik.system.NativeStart.main (NativeStart.java)

这是LastNewsRVAdapter.java构造函数。

public LastNewsRVAdapter(Context context, List<LatestNewsData> 
    latestNewsDataList, FirstPageSideBanner sideBanner) {
    this.context = context;
    this.latestNewsDataList = latestNewsDataList;
    inflater = LayoutInflater.from(context);
    this.sideBanner = sideBanner;
}

这是onCreateView片段内的代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    final View view = inflater.inflate(R.layout.fragment_main_sonku_kabar, container, false);
    tvSonkuKabar = view.findViewById(R.id.textview_sonku_kabar_main);
    tvNegizgiKabar = view.findViewById(R.id.textview_negizgi_kabar_main);
    refresh(view);

    final SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.mainRefreshSonkuKabar);
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refresh(view);
            swipeRefreshLayout.setRefreshing(false);
        }
    });
    setHasOptionsMenu(true);
    return view;
}

这是refreshFragment内部的方法

private void refresh(final View view) {
    sideBanner = new FirstPageSideBanner();

    final RecyclerView rvLatestNews = (RecyclerView) view.findViewById(R.id.recViewLastNews);
    rvLatestNews.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
    rvLatestNews.setNestedScrollingEnabled(false);
    App.getApiService().getLatestNews().enqueue(new Callback<LatestNews>() {
        @Override
        public void onResponse(Call<LatestNews> call, Response<LatestNews> response) {
            if (response.isSuccessful() && response.body().isSuccessfull()){
                adapter = new LastNewsRVAdapter(getContext(), response.body().getData(), sideBanner);
                rvLatestNews.setAdapter(adapter);
                tvSonkuKabar.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public void onFailure(Call<LatestNews> call, Throwable t) {

        }
    });
Leandro Ocampo:

首先,如您在此链接上看到的那样,片段生命周期内的onCreateView()方法位于onAttach()之后,因此此时您应该已经有一个上下文。您可能想知道,为什么getContext()然后返回null?问题出在您创建适配器的位置:

App.getApiService().getLatestNews().enqueue(new Callback<LatestNews>() {
        @Override
        public void onResponse(Call<LatestNews> call, Response<LatestNews> response) {
            if (response.isSuccessful() && response.body().isSuccessfull()){
                adapter = new LastNewsRVAdapter(getContext(), response.body().getData(), sideBanner);
                rvLatestNews.setAdapter(adapter);
                tvSonkuKabar.setVisibility(View.VISIBLE);
            }
        }

        @Override
        public void onFailure(Call<LatestNews> call, Throwable t) {

        }
    });

尽管您在onCreateView()中指定了回调,但这并不意味着该回调中的代码将在此时运行。网络调用完成后,它将运行并创建适配器。考虑到这一点,您的回调可能会在该片段的生命周期中的那一点之后运行。我的意思是,用户可以进入该屏幕(片段)并转到另一个片段,或者在网络请求完成(并且回调运行)之前返回上一个片段。如果发生这种情况,那么如果用户离开该片段(可能已调用onDetach()),则getContext()可能返回null。

此外,如果活动在您的网络请求完成之前被破坏,您也可能会发生内存泄漏。因此,您有两个问题。

我对解决这些问题的建议是:

  1. 为了避免空指针异常和内存泄漏,应在调用片段内的onDestroyView()时取消网络请求(retrofit返回可以取消请求的对象:link)。

  2. 防止空指针异常的另一个选项是将适配器LastNewsRVAdapter的创建移到回调之外,并在片段中保留对其的引用。然后,在回调中使用该引用来更新适配器的内容:链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么导航属性有时会返回null?

来自分类Dev

为什么返回std :: optional有时会移动,有时会复制?

来自分类Dev

为什么Activity getIntent()。getExtras()有时会返回null?

来自分类Dev

为什么Relation.size有时会在Rails 4中返回哈希

来自分类Dev

为什么在 javascript 中执行导入时,有时会返回未定义的变量?

来自分类Dev

为什么fork有时会返回父级,有时会返回子级?

来自分类Dev

为什么Clang有时会返回nullptr,有时会返回我想要的东西?

来自分类Dev

为什么Ruby Procs有时会返回而有时却是错误?

来自分类Dev

为什么 R source() 有时会工作有时会出错

来自分类Dev

为什么grep有时会返回带有两个斜杠的目录?

来自分类Dev

为什么 gensim summarise() 有时会返回空白?

来自分类Dev

BigQuery:为什么表范围装饰器有时会返回错误的结果?

来自分类Dev

为什么JavaScript getDate()有时会返回上一个日期?

来自分类Dev

为什么querySelectorAll有时会返回实时DOM元素?

来自分类Dev

为什么 super().__new__ 有时会返回父类的类型?

来自分类Java

request.getRemoteUser()有时会返回null

来自分类Dev

Geolocation.GetLastKnownLocationAsync()有时会返回null

来自分类Java

为什么Java编译器有时会允许对null取消装箱?

来自分类Dev

为什么主题有时会发出数据?

来自分类Dev

为什么✓符号有时会被替换为“ –”?

来自分类Dev

为什么Vim有时会创建.swp文件?

来自分类Java

为什么这段代码有时会抛出NullPointerException?

来自分类Dev

为什么有时会以自然顺序打印HashMap

来自分类Dev

为什么registerForRemoteNotificationTypes有时会失败?

来自分类Dev

为什么结帐有时会暂存文件?

来自分类Dev

为什么我的程序有时会卡住?

来自分类Dev

为什么有时会显示隐藏的表单失火?

来自分类Dev

为什么主题有时会起作用?

来自分类Dev

为什么后台进程有时会自发停止?

Related 相关文章

  1. 1

    为什么导航属性有时会返回null?

  2. 2

    为什么返回std :: optional有时会移动,有时会复制?

  3. 3

    为什么Activity getIntent()。getExtras()有时会返回null?

  4. 4

    为什么Relation.size有时会在Rails 4中返回哈希

  5. 5

    为什么在 javascript 中执行导入时,有时会返回未定义的变量?

  6. 6

    为什么fork有时会返回父级,有时会返回子级?

  7. 7

    为什么Clang有时会返回nullptr,有时会返回我想要的东西?

  8. 8

    为什么Ruby Procs有时会返回而有时却是错误?

  9. 9

    为什么 R source() 有时会工作有时会出错

  10. 10

    为什么grep有时会返回带有两个斜杠的目录?

  11. 11

    为什么 gensim summarise() 有时会返回空白?

  12. 12

    BigQuery:为什么表范围装饰器有时会返回错误的结果?

  13. 13

    为什么JavaScript getDate()有时会返回上一个日期?

  14. 14

    为什么querySelectorAll有时会返回实时DOM元素?

  15. 15

    为什么 super().__new__ 有时会返回父类的类型?

  16. 16

    request.getRemoteUser()有时会返回null

  17. 17

    Geolocation.GetLastKnownLocationAsync()有时会返回null

  18. 18

    为什么Java编译器有时会允许对null取消装箱?

  19. 19

    为什么主题有时会发出数据?

  20. 20

    为什么✓符号有时会被替换为“ –”?

  21. 21

    为什么Vim有时会创建.swp文件?

  22. 22

    为什么这段代码有时会抛出NullPointerException?

  23. 23

    为什么有时会以自然顺序打印HashMap

  24. 24

    为什么registerForRemoteNotificationTypes有时会失败?

  25. 25

    为什么结帐有时会暂存文件?

  26. 26

    为什么我的程序有时会卡住?

  27. 27

    为什么有时会显示隐藏的表单失火?

  28. 28

    为什么主题有时会起作用?

  29. 29

    为什么后台进程有时会自发停止?

热门标签

归档