0
public void onCreate()
{
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        mSensorManager.registerListener(this, mSensorManager
                .getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_FASTEST);
        while(true);
}

-

 public void onCreate()
    {
            new lt().start()
            while(true);
    }
class lt extends Thread
{
    public void run()
    {
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        mSensorManager.registerListener(this, mSensorManager
                .getDefaultSensor(Sensor.TYPE_LIGHT),
                SensorManager.SENSOR_DELAY_FASTEST);
        while(true);
    }
}

while を挿入すると、光センサーは光の値を取りません。このコード (while を除く) を別のスレッド内に配置しても同じです。なんで?リスナーはバックゴーランドで動作するべきではありませんか? センサーの登録後、光の値を確認する前に、少し待つ必要があります(何か他のものに置き換えます)。どのようにできるのか?

4

1 に答える 1

0

絶対にやってはいけないこと

 while(true);

onCreate(); で

Android のメイン (UI) スレッドを結び付けます。

=========================

Android はイベント ループを実行します。コールバックはイベント ループで実行されるようにスケジュールされていますが、onCreate() から制御が戻るまで実行できません。したがって、アプリケーションが応答しないというエラーが発生するまで、プログラムはハングします。

これ: http://developer.android.com/reference/android/os/Looper.html Android コードの下にあるメカニズムについて読み始めるのに適した場所です。

==================

スレッドを使用するコードは、メイン スレッドがまだ onCreate() でハングしているため、さらに悪化していますが、IT スレッドのコールバックをスケジュールしようとしていますが、イベント ループは実行されていません。(言うまでもなく、それもしばらくハングアップしています(true); )


これを試して:

public void onCreate()
{
    super.onCreate();
    setContentView(R.layout.myLayout);
    [other activity initialization code]
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    mSensorManager.registerListener(this, mSensorManager
            .getDefaultSensor(Sensor.TYPE_LIGHT),
            SensorManager.SENSOR_DELAY_FASTEST);
}

そして、例を示すこれを読んでください:http://developer.android.com/reference/android/hardware/SensorManager.html

于 2013-11-12T22:12:03.800 に答える