从屏幕外片段获取SensorManager会导致应用程序NPE崩溃

时间:2014-12-08 22:31:46

标签: android android-fragments android-viewpager

我的应用中有一个ViewPager,目前有6个片段。我已经适当地设置了屏幕外限制,直到现在还没有出现问题。在有问题的片段中,有一个ListView,它包含所有传感器的名称和供应商。当我尝试将所有这些信息检索到String时,我的应用程序崩溃了。罪魁祸首就是这一行 SensorManager sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);

这是在onActivityCreated上初始化的,并且除了在尝试获取文本和字符串时效果很好,它为空。

public String retrieveContent() {
    String content = "";

    if (sensorItems == null) {
        SensorManager sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
        List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
        sensorItems = new ArrayList<>();
        for (int i = 0; i < deviceSensors.size(); i++) {
            SensorListModel sensorListModel = new SensorListModel();
            sensorListModel.name = deviceSensors.get(i).getName();
            sensorListModel.vendor = deviceSensors.get(i).getVendor();
            sensorItems.add(sensorListModel);
        }
    }


    for (int i = 0; i < sensorItems.size(); i++) {
        content = content + sensorItems.get(i).retrieveContent();
    }

    return content;
}

和我非常简单的模型,如果你需要看到它。

public class SensorListModel {

    TextView tvName;
    TextView tvVendor;
    public String name;
    public String vendor;

    public String retrieveContent() {

        return tvName.getText() + "\n"
                + tvVendor.getText() + "\n\n";
    }
}

一切正常,数据显示在listview中。在调用retrieveContent方法

时,我不明白它崩溃的原因

2 个答案:

答案 0 :(得分:2)

如果它不在屏幕上,则其视图将被销毁(onDestroyView()),并且它将与ActivityonDetach())分离。这意味着当您致电getActivity()时,结果将为空,因为它不再附加到Activity

只需在SensorManager中保留对onAttach()的引用:

private SensorManager mSensorManager;

public void onAttach(Activity activity) {
    super.onAttach(activity);
    mSensorManager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
}

答案 1 :(得分:0)

好吧,它与Context有关,所以我在我的MainActivity中添加了retrieveContent()方法,在用户需要时保存了Fragments。不再从Fragment中检索它(即使它在我调用此方法之前创建,导致NPE),并从主活动调用。