Android Threading Issue - PullRequest
       2

Android Threading Issue

3 голосов
/ 22 августа 2010

У меня есть следующий код, который я хочу иметь возможность повторять каждые 30 секунд.

MyLocation myLocation = new MyLocation();
    public LocationResult locationResult = new LocationResult() {
        @Override
        public void gotLocation(final Location location) {
            GeoPoint myGeoPoint = new GeoPoint(
                    (int) (location.getLatitude() * 1000000),
                    (int) (location.getLongitude() * 1000000));
            myMapController.animateTo(myGeoPoint);
            myMapController.setZoom(10);

            lat = location.getLatitude();
            lon = location.getLongitude();

            new OverlayTask().execute();


            Timer timer;
            timer = new Timer();
            timer.scheduleAtFixedRate(new MyTimerTask(), 30000, 30000); 
        }

    };

Срабатывает, как только у меня есть местоположение, и OverlayTask выполняется нормально, он также будет выполняться, когда назначен элементу меню для его принудительного вызова.

Однако внутри таймера я получаю ошибку.

public class MyTimerTask extends TimerTask {
    public void run() {
        try {
            Log.i(">>>>>>>>>>>> Refresh: ", "Success");
            new OverlayTask().execute();
        } catch (Exception e) {
            Log.e(">>>>>>>>>>>> Error executing MyAsyncTask: ", e.getMessage(), e);
        }
    }
}

Ошибка ....

Ошибка выполнения MyAsyncTask: (2573): только исходный поток, создавший иерархию представлений, может касаться его представлений.

1 Ответ

3 голосов
/ 22 августа 2010

Используйте метод runOnUiThread:

public class MyTimerTask extends TimerTask {
    public void run() {
        runOnUIThread(new Runnable(){
            public void run(){
                try {
                    Log.i(">>>>>>>>>>>> Refresh: ", "Success");
                    new OverlayTask().execute();
                } catch (Exception e) {
                    Log.e(">>>>>>>>>>>> Error executing MyAsyncTask: ", e.getMessage(), e);
                }
            }
        });
    }
}
...