2011-06-23 126 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

你试图启动Android的事件处理程序,如onLocationChanged您创建一个新的线程中。在线程类的“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

Yoi需要出示从UI线程敬酒。你可以在Activity上使用runOnUiThread方法来做到这一点。 以下是带示例的说明Android: Toast in a thread