цикл обработчика Android - PullRequest
       5

цикл обработчика Android

0 голосов
/ 23 июня 2011

Может кто-нибудь, пожалуйста, скажите мне, в чем проблема с этим 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 ]

3 голосов
/ 23 июня 2011

Вы пытаетесь запустить обработчик событий 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 голосов
/ 23 июня 2011

Йой нужно будет показать тост из пользовательского интерфейса.Вы можете сделать это с помощью метода runOnUiThread в Activity.Вот объяснение с примером Android: тост в теме

...