0

アンドロイド初心者ですのでお手柔らかにお願いします。私はいくつかの「演習」を行っており、ホーム Wi-Fi ネットワークの 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);
    }
}

私のコードは約 1 秒ごとに実行されるため、この目的のために TimerTask を使用します。そして、これが run() メソッドと内部で実行するためのコードを含む私の TimerTask クラスです。

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!

を保持するバンドルを使用して、エクストラのバンドルを使用してインテントを作成していますrssi。この不要なバンドルは省略してください。

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 に答える