【问题标题】:setUserVisibleHint() throwing NullPointerException when calling getActivity()setUserVisibleHint() 在调用 getActivity() 时抛出 NullPointerException
【发布时间】:2017-07-01 03:02:22
【问题描述】:

我在 ViewPager 中创建了 3 个片段。我仅在用户可见特定片段时才尝试从服务器获取数据。为此,我在 setUserVisibleHint() 中调用了我的 Web 服务方法。但是当我在该方法中使用 getActivity() 时,我得到了 NullPointerException。我怎样才能确保我只加载一次数据并且当它对用户可见时?代码如下:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser && !_areLecturesLoaded){
            if(getActivity() == null){ //this is always null
                Log.e("Fragment1","No Activity");
            }else{
                getLatLong();
            }
            _areLecturesLoaded = true;
        }
    }

    private void getLatLong() {
        mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                // The next two lines tell the new client that “this” current class will handle connection stuff
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                //fourth line adds the LocationServices API endpoint from GooglePlayServices
                .addApi(LocationServices.API)
                .build();
    }

我已验证 onAttach() 方法在 setUserVisibleHint() 之后被调用。在附加 Activity 之前,setUserVisibleHint() 正在启动。

【问题讨论】:

  • 在调用getActivity().call isAdded()检查之前检查是否将片段添加到活动中。
  • setUserVisibleHint() 在 onAttach() 方法之前被调用。这意味着在附加片段之前, setUserVisibleHint() 方法被触发。我该如何解决这个问题?

标签: android android-fragments android-tablayout


【解决方案1】:

在调用 onAttach() 时保留 Activity 引用,并在任何地方使用它而不是 getActivity() 像这样:

@Override 
public void onAttach(Activity activity) {
            super.onAttach(activity);
            mActivity = activity;
            }

【讨论】:

    【解决方案2】:

    试试这个:

    boolean isVisible=false;
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isVisible=isVisibleToUser;
    
    }
    
     @Override
    public void onAttach(Context context) {
        if(visible){
        // do what you must todo
        }else{
         //do what you must todo
        }
    
    }
    

    【讨论】:

    • 在上面的代码中。第一次加载片段时不会调用case FRAGMENT1:。但是在滑动之后onPageSelected() 正在为FRAGMENT2FRAGMENT3 工作。如果我回到FRAGMENT1,那么case FRAGMENT1: 就会被调用。
    • 第一次加载数据。但是,如果我滑动并返回片段。没有数据正在加载。
    • 只检查是否加载数据之前不要再次加载其他加载
    • 我直接调用if(visible){ }里面的网络操作可以吗?
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2020-05-11
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多