调用getSystemService()时获取NullPointerException

时间:2015-10-20 07:30:41

标签: android android-activity nullpointerexception

我的问题是,在我的MainActivity的onCreate()方法中,我正在创建新的Thread对象,我想将其传递给this活动,而不是在该线程中使用它来调用getSystemService()。但最后,当我启动应用程序时,它崩溃了,我得到了NullPointerException。

我已经发现问题可能是我传递了对super.onCreate()的活动的引用,但在我的代码中,super.onCreate()在传递引用之前执行。

这是我的MainActivity的onCreate()方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Instance which contains thread for obtaining wifi info
    final WifiInfoThread wifi_info = new WifiInfoThread(this);
....
}

这是Thread类,我试图引用系统服务

public class WifiInfoThread extends Thread {
// Constructor for passing context to this class to be able to access xml resources
Activity activity;
WifiInfoThread(Activity current) {
    activity = current;
}

// Flag for stopping thread
boolean flag = false;
// Obtain service and WifiManager object
WifiManager current_wifi = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);

// Runnable object passed to UIThread
Runnable uirunnable = new Runnable() {
    @Override
    public void run() {
        // Get current wifi status
        WifiInfo wifi_info = current_wifi.getConnectionInfo();

        // Things with showing it on screen
        TextView tv_output = (TextView) activity.findViewById(R.id.tv_output);
        String info = "SSID: " + wifi_info.getSSID();
        info += "\nSpeed: " + wifi_info.getLinkSpeed() + " Mbps";
        tv_output.setText(info);
    }
};

public void run() {
    flag = true;

    for(; flag; ) {
        activity.runOnUiThread(uirunnable);
        try {
            this.sleep(500);
        }
        catch(InterruptedException e) {}
    }
}

}

3 个答案:

答案 0 :(得分:2)

在初始化activity.getSystemService之前,您正在使用activity。为了解决这个问题,请将以下行移至Constructor

// Obtain service and WifiManager object
WifiManager current_wifi = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);

喜欢

WifiManager current_wifi;
WifiInfoThread(Activity current) {
    activity = current;
    current_wifi = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
}

答案 1 :(得分:1)

在你的主题的current_wifi中移动初始值Constructor

// Obtain service and WifiManager object
WifiManager current_wifi = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);

在您的情况下,activity仍然是null引用。在构造函数

中分配后,它会获得一个有效的

答案 2 :(得分:1)

其他答案将向您展示如何解决此问题。您还应该知道 NullPointerException的原因:在java中,您的代码不按您编写的顺序执行。在成员函数(方法)之外编写的每个东西都首先被执行(有点)。然后调用构造函数。因此,您在Conetxt.getSystemService()上呼叫activity,即null

对于后台工作,android还有AsyncTaskIntentService。看看他们。