使用getInt时的NullPointerException(String)

时间:2012-12-15 20:45:13

标签: java android timertask

我是机器人初学者,所以请对我很轻松。我正在做一些“练习”,我正在写一个简单的应用程序,它将告诉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:

enter image description here

2 个答案:

答案 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);

从背景开始激活时需要设置此标志