Почему не работает Timer в Thread?

219
26 мая 2018, 21:00

Реализовал отправку координатов пользователя на сервер, в UI потоке без TIMER код отрабатывает, теперь пытаюсь запускать поток раз в 5 секунд, ниже листинг

private void refreshUserCoordinates(final Context contextThread) {
    Intent intent = getIntent();
    final String user = intent.getStringExtra("user");
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            GeoPosition geoPosition = new GeoPosition();
            geoPosition.SetUpLocationListener(contextThread);
            ServerInteraction serverInteraction = new ServerInteraction("http://razdvatri/refreshCoordinates.php",
                    "{\"user\" " + ":\"" + user + "\", \"latitude\" " + ":\"" + geoPosition.getLatitude() + "\", \"longitude\" :" + "\"" + geoPosition.getLongitude() + "\"" + "}", "put");
            serverInteraction.execute();
        }
    }, 0L, 50L * 1000);
}

Вот что пишет LogCat

05-17 16:14:06.735 5372-5441/popovvad.findme E/AndroidRuntime: FATAL EXCEPTION: Timer-0 Process: popovvad.findme, PID: 5372 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.(Handler.java:204) at android.os.Handler.(Handler.java:118) at android.location.LocationManager$ListenerTransport$1.(LocationManager.java:234) at android.location.LocationManager$ListenerTransport.(LocationManager.java:234) at android.location.LocationManager.wrapListener(LocationManager.java:872) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:885) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:470) at popovvad.findme.GeoPosition.SetUpLocationListener(GeoPosition.java:49) at popovvad.findme.MapActivity$1.run(MapActivity.java:81) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505) 05-17 16:14:30.306 5372-5372/popovvad.findme D/AndroidRuntime: Shutting down VM 05-17 16:14:30.307 5372-5372/popovvad.findme I/Process: Sending signal. PID: 5372 SIG: 9

Понимаю, что основная ошибка описана здесь -

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

Как починить ?

Answer 1

Помогло в итоге в методе run() добавить

if (Looper.myLooper() == null){
     Looper.prepare();
 }

Полный листинг метода

private void refreshUserCoordinates(final Context contextThread) {
    Intent intent = getIntent();
    final String user = intent.getStringExtra("user");
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            if (Looper.myLooper() == null)
            {
                Looper.prepare();
            }
            GeoPosition geoPosition = new GeoPosition();
            geoPosition.SetUpLocationListener(contextThread);
            ServerInteraction serverInteraction = new ServerInteraction("http://razdvatri.ru/refreshCoordinates.php",
                    "{\"user\" " + ":\"" + user + "\", \"latitude\" " + ":\"" + geoPosition.getLatitude() + "\", \"longitude\" :" + "\"" + geoPosition.getLongitude() + "\"" + "}", "put");
            serverInteraction.execute();
        }
    }, 0L, 50L * 1000);
}
READ ALSO
C помощью чего реализовать передачу информации с сервера к клиенту [закрыт]

C помощью чего реализовать передачу информации с сервера к клиенту [закрыт]

СабжСервер должен отправлять 50-ти клиентам каждую секунду информацию (для всех клиентов одинаковая) в формате JSON, после того как они "подпишутся"...

186
Отправка геолокации ботом Telegram Java

Отправка геолокации ботом Telegram Java

Пишу бота для телеграмм на JavaМне нужно подключить к нему метод отправки геолокации

170
Изображения из Firebase storage в RecyclerView

Изображения из Firebase storage в RecyclerView

Как я могу загружать изображения получение из Firebase storage в RecyclerView? Как должен будет выглядеть код адаптера, в котором происходит загрузка изображения...

176
Android переход в сообщения

Android переход в сообщения

Мне нужно по нажатию кнопки перейти в Сообщения андроида и уже чтобы был вписан номер к кому нужно отправить и готовый текстТекст и номер...

159