2012-04-16 3 views
0

Я пишу службу определения местоположения с интервалом обновления для отправки обновлений местоположения на сервер. Но я пытаюсь обновить эту переменную интервала в сервисе через пользовательский ввод (AlertDialog). Он отлично работает при жестком кодировании.Интервал обновления для службы определения местоположения Android

Я использую этот код, чтобы получить переменную интервала из класса AlertDialog, в службе onCreate().

public void onCreate() { 
    super.onCreate(); 


    final boolean tr=true; 
     new Thread(new Runnable() { 
       public void run() { 

       while (tr) { 

        //check your static variable here 
        updateInterval=ShowCurInterval.loadCurInterval(getApplicationContext());//ShowCur Interval is the Alert Dialog calss 
        Log.d(" INTERVAL ","Interval "+ updateInterval); 
        try { 
        Thread.sleep(10000); 
        } catch (InterruptedException e) { 
        e.printStackTrace(); 
        } 

       } 
       }} 
       ).start(); 

     startLocationListener(updateInterval); 
} 

И я могу также увидеть новое UpdateInterval значение LOG (который добавляемые Диалог оповещения). Но requestLocationUpdates() все еще использует предварительно определенное значение updateInterval.

Вот метод startLocationListener():

public void startLocationListener(int updateInterval) { 
    LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locManager.removeUpdates(locListener); 
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, updateInterval, updateDistance, locListener); 
    Log.d(getClass().getSimpleName(), "Loclistener started, Updatetime: " + updateInterval); 
    Toast.makeText(getApplicationContext(), "UPDATE INTERVAL"+updateInterval,Toast.LENGTH_SHORT); 
    preInterval = updateInterval; 
} 

Кто-нибудь есть какие-либо предложения, как я могу обновить эту переменную?

@binW Edited часть за исключением:

Handler mhandler = new Handler(); 
     mhandler.postDelayed(new Runnable(){ 

      public void run(){ 
       Looper.prepare(); 

       updateInterval=SingletonManager.getInstance().loadCurInterval(getApplicationContext()); 
       SingletonManager.getInstance().saveCurInterval(getApplicationContext(), updateInterval); 
       startLocationListener(updateInterval); 
       Log.d(" INTERVAL ","Interval "+ updateInterval); 
       //startChecking(); 


      } 
     }, 2000); 

Исключение:

04-17 03:18:55.250: E/AndroidRuntime(2146): java.lang.RuntimeException: Only one Looper may be created per thread 

Спасибо заранее.

+0

Что происходит? Работает ли только с предыдущей скоростью обновления? – 5hssba

+0

@raju Привет. Да, он работает только с предыдущей скоростью обновления. updateInterval - глобальная переменная со значением 10000 (миллисекунда). – crtn

ответ

1

Вы вызываете startLocationListener() в onCreate(), а не в потоке, который вы создали для получения нового значения updateInterval. Но вызов startLocationListener (updateInterval); выполняется до того, как выполняется новый поток, и, следовательно, вы получите старое значение updateInterval. Я считаю, вы должны изменить свой код следующим образом:

public Handler handler; 
public void onCreate() { 
    super.onCreate(); 

    handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      startLocationListener(updateInterval); 
     } 
    }; 

    final boolean tr=true; 
     new Thread(new Runnable() { 
     public void run() { 
      while (tr) { 
       //check your static variable here 
       updateInterval=ShowCurInterval.loadCurInterval(getApplicationContext());//ShowCur Interval is the Alert Dialog calss 
       handler.sendEmptyMessage(1); 
       Log.d(" INTERVAL ","Interval "+ updateInterval); 
       try { 
        Thread.sleep(10000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       } 
       }} 
     ).start(); 
} 
+0

Я пробовал это ... но я получаю это исключение. – crtn

+0

04-16 08: 15: 43.850: E/AndroidRuntime (13728): java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare() – crtn

+0

А также startLocationListener() не запускается. – crtn

Смежные вопросы