2011-06-23 3 views
0

は、いずれかが、このlogcatに問題が何であるかを教えてくださいすることができますしてくださいアンドロイドハンドラループ

06-23 11:09:12.060: ERROR/AndroidRuntime(1116): FATAL EXCEPTION: Speedometer 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at android.os.Handler.<init>(Handler.java:121) 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at android.widget.Toast.<init>(Toast.java:68) 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at android.widget.Toast.makeText(Toast.java:231) 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at com.paad.whereami.WhereAmI.updateGUI(WhereAmI.java:883) 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at com.paad.whereami.WhereAmI.access$5(WhereAmI.java:860) 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at com.paad.whereami.WhereAmI$4.run(WhereAmI.java:845) 
06-23 11:09:12.060: ERROR/AndroidRuntime(1116):  at java.util.Timer$TimerImpl.run(Timer.java:284) 

答えて

3

あなたが作成した新しいスレッド内onLocationChangedようなAndroidのイベントハンドラを起動しようとしています。スレッドクラスの "run()"メソッドでは、Looper.prepare()を呼び出し、イベントハンドラを登録してからLooper.loop()を呼び出す必要があります。スレッドを終了したら、Looper.myLooper()。quit()メソッドを呼び出して終了します。

例:

public class MyActivity extends Activity { 
    private Thread thread = new ThreadClass(); 
    private static Looper threadLooper = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      // Begin the location reading thread. 
      thread.start(); 

      // do UI stuff in here 
      // never sleep in UI thread. Example only. 
      try { 
       Thread.sleep(4000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      // end the thread. 
      threadLooper.quit(); 
      // quit the activity 
      this.finish(); 
    } 

    private class ThreadClass extends Thread { 
     @Override 
     public void run() { 
      Looper.prepare(); 

      LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      MyLocationListener locListen = new MyLocationListener(); 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, locListen); 

      threadLooper = Looper.myLooper(); 

      Looper.loop(); // loop until "quit()" is called. 

      // remove the update listener to prevent the locationManager from calling it. 
      locationManager.removeUpdates(locListen); 
     } 
    } 

    private class MyLocationListener implements LocationListener {  
     @Override 
     public void onLocationChanged(Location location) { 
      /* Do very intensive work here */ 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      } 
    } 
} 
0

宵は、UIスレッドからトーストを表示する必要があります。 ActivityのrunOnUiThreadメソッドを使用して実行できます。 ここに例文の説明がありますAndroid: Toast in a thread