2010-08-22 180 views
5

我是android新手,忍受着我。線程運行中的處理程序

我有一個TimerTask,我在其中定義run()。在內部運行(),我打電話

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
    LOCATION_UPDATES_MIN_TIME_MS, LOCATION_UPDATES_MIN_DISTANCE_M, gpsListener); 

它抱怨說無法創建Handler,因爲我相信它的後臺線程。我如何解決它?

編輯:代碼片斷

locationTask = new TimerTask() { 

     @Override 
     public void run() { 
      Log.d(Commands.TAG, "Running location Task"); 
      myLocationProvider = new MyLocationProvider(locationManager, handler, MyService.this); 
      myLocationProvider.start(); 
      myLocationProvider.stop(); 
     } 
    }; 

,後來它的計劃如下:

locationTimer = new Timer(); 
    locationTimer.schedule(locationTask, 10000, cmds.getAlertInterval()*60); 

當。開始叫,requestLocationUpdates()失敗

+0

你的解決方案是什麼?我有同樣的問題(從定時器內部訪問GPS)。 – stackoverflowuser2010 2012-07-12 03:55:24

回答

4

您需要調用requestLocationUpdates從一個線程內的活套,即最好是主線程。 (requestLocationUpdates本身很快並且不會阻塞,所以這樣做並不可恥)。

如果您的應用程序的寫入方式妨礙了您的操作,則可以使用處理程序。 文檔有這應該是非常正是你需要的一個例子:http://developer.android.com/resources/articles/timed-ui-updates.html

或者,你可以創建一個Runnable使用此指令就可以撥打Activity.runOnUiThread()

+1

我不能從主線程運行它,因爲它必須是TimerTask(這是一個線程)的一部分,並且當我用 包圍它時Looper.prepare(); requestLocationUpdates(); Looper.loop(); 它會凍結在最後的聲明 對於您的替代解決方案,活動不能使用,因爲這是一個服務,而不是一個UI線程。 任何替代品? – Taranfx 2010-08-23 03:22:14

+0

你在什麼線程中創建了Handler?你能否發佈更多的代碼和錯誤消息? – EboMike 2010-08-23 06:07:34

1

我遇到過類似的情況,我無法通過自己的線程(使用Looper)/ HandlerThreads來混合LocationListener的位置更新。解決方案是使用PendingIntent和requestLocationUpdates(provider,minTime,minDistance,intent)。看看:How to receive location updates without using a service

相關問題