我是机器人初学者,所以请对我很轻松。我正在做一些“练习”,我正在写一个简单的应用程序,它将告诉RSSI家庭wifi网络的力量。获得这个数字非常简单,但更新它并在屏幕上显示它就像我想的那样复杂一点。
首先这是我的onCreate活动。在这个活动中,我正在推出另一个Android组件 - 服务。因为代码将在后台运行(我知道我可以使用线程或其他东西,但这是为了“练习”的缘故,我有一些想法如何处理这个应用程序,同时运行服务而不与UI交互)< / p>
public class MainActivity extends Activity {
TextView wifi_check;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
referenceViews();
startService(new Intent(this, CheckingWifiService.class));
//wifi_check.setText(""+getIntent().getExtras().getInt("RSSI"));
}
private void referenceViews() {
wifi_check = (TextView) findViewById(R.id.wifiCheck_TV);
}
}
因为我的代码会每隔一秒左右运行一次,所以我会使用TimerTask来达到这个目的。这是我的TimerTask类,包括run()方法和用于执行
内部的代码public class TimerTsk extends TimerTask {
Context act;
WifiManager wifiMan;
WifiInfo info;
Bundle sendInfo;
Intent intent;
int rssi;
public TimerTsk(Context context) {
act = context;
}
@Override
public void run() {
intent = new Intent();
sendInfo = new Bundle();
wifiMan = (WifiManager) act.getSystemService(Activity.WIFI_SERVICE);
info = wifiMan.getConnectionInfo();
rssi = info.getRssi();
Log.d("WORKED", "RUNNING SUCESSFULLY");
// i want to send info to my activity
sendInfo.putInt("RSSI", rssi);
intent.putExtras(sendInfo);
}
}
从这个课程中,我想将RSSI的结果发送到我的活动,然后更新文本。但是当我在下面调用这段代码时,在活动中我总是得到NullPointerException。
wifi_check.setText(""+getIntent().getExtras().getInt("RSSI"));
说实话,我很难搞清楚代码的哪一部分正在抛出。而且我发现更确切地说,这部分代码正在抛出一个范围。
getInt( “RSSI”)
总的来说,我看到该服务正在运行,因为在我的LOGCAT中,我看到我在TimerTsk类中使用Log.d创建的消息。
任何想法为什么会发生这种情况?
这是我的服务类:
public class CheckingWifiService extends Service{
int rssi;
Timer time;
TimerTsk ttsk;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
time = new Timer();
time.schedule(new TimerTsk(getApplicationContext()), 500);
return START_STICKY;
}
}
这是我的LogCat:
答案 0 :(得分:3)
我看到一个常见的错误。不要这样做:
sendInfo.putInt("RSSI", rssi);
intent.putExtras(sendInfo); // This adds a Bundle to your existing Bundle!
您正在创建一个Intent,其中包含一个额外的Bundle,其中包含一个包含rssi
的Bundle。遗漏这个不必要的Bundle:
intent.putExtras("RSSI", rssi);
现在,您可以在下一个活动中使用:
getIntent().getIntExtra("RSSI", 0);
但是,您应该始终检查以确保没有任何意外的null
变量:
Intent in = getIntent();
if(in != null) {
int rssi = in.getIntExtra("RSSI", -1);
if(rssi < 0)
wifi_check.setText(""+rssi);
else
wifi_check.setText("Unknown");
}
答案 1 :(得分:0)
你的活动开始了吗?我没有看到任何对startActivity()的调用。在任何情况下,如Sam所述,您只需要为您的意图调用putExtra。别忘了打电话
你的活动开始了吗?我没有看到任何对startActivity()的调用。在任何情况下,如Sam所述,您只需要为您的意图调用putExtra。别忘了打电话
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
从背景开始激活时需要设置此标志