我的问题是,在我的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) {}
}
}
}
答案 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还有AsyncTask
和IntentService
。看看他们。