android处理程序循环

时间:2011-06-23 15:21:38

标签: android loops handler

任何人都可以告诉我这个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)

2 个答案:

答案 0 :(得分: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) {
            }
    }
}

答案 1 :(得分:0)

你需要从ui线程中显示吐司。您可以在Activity上使用runOnUiThread方法执行此操作。 以下是示例Android: Toast in a thread

的说明