0

我是android初学者,所以请放轻松。我正在做一些“练习”,我正在编写简单的应用程序,它将告诉家庭 wifi 网络的 RSSI 强度。得到这个数字很容易,但是更新它并在屏幕上显示它就像我想的那样复杂一点。

首先这是我的 onCreate 活动。在此活动中,我将启动另一个 android 组件 - 服务。因为代码将在后台运行(我知道我可以使用线程或其他东西,但这是为了“练习”,我有一些想法如何处理这个应用程序,同时运行服务而不与 UI 交互)

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:

在此处输入图像描述

4

2 回答 2

3

我看到一个常见的错误。不要这样做:

sendInfo.putInt("RSSI", rssi);
intent.putExtras(sendInfo); // This adds a Bundle to your existing Bundle!

您正在创建一个 Intent,带有一个 Bundle 的附加功能,一个 Bundle 包含rssi. 省去这个不必要的 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");
}
于 2012-12-15T20:50:19.687 回答
0

你的活动开始了吗?我没有看到对 startActivity() 的任何调用。在 Sam 提到的任何情况下,您只需要调用 putExtra 即可。别忘了打电话

你的活动开始了吗?我没有看到对 startActivity() 的任何调用。在 Sam 提到的任何情况下,您只需要调用 putExtra 即可。别忘了打电话

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

从后台启动活动时,您需要放置此标志

于 2012-12-15T20:57:42.240 回答