Как остановить looper.loop () в программе многопоточности Android? - PullRequest
2 голосов
/ 26 января 2011

В настоящее время я пытаюсь разработать приложение для Android.Приложение сначала считывает данные о местоположении с GPS (через onLocationUpdates(GPS_PROVIDER, 0, 0 , Listener), а если GPS не может получить данные в определенное время (в моем случае 5 секунд), оно снова запрашивает Network provider (через onLocationUpdates(NETWORK_PROVIDER,0,0, Listener)).

В моей программе я выполнил эту задачу следующим образом.

mWorker = new WorkerThread();
mWorker.start(); //  Thread creation and Calling run() Method 

class WorkerThread extends Thread{      
public void run() {   
try {    
if(isGPSEnabled){   

 //Call GPS_PROVIDER for Location updates,
 //Will get location value in Location Change Listener

 requestLocationUpdates(GPS_PROVIDER,0,0,Listener);
Log.d(TAG,"GPS Listener is  registered and thread is going for Sleep");
Thread.sleep(THREAD_SLEEP_TIME);

}else if (isNetworkEnbles){
// if  GPS_PROVIDER is not available, will call to NETWORK_PROVIDER 
// Will get location value to OnLocationChangeListener

 requestLocationUpdates(NETWORK_PROVIDER,0,0,listener);
 Log.d(TAG,"NETWORK Listener is  registered and thread is going for Sleep");
Thread.sleep(THREAD_SLEEP_TIME);
}
} catch ( InterruptedException e ){ 
   // Thread is interrupted on OnLocationChange Listener
  // Thread has been Interrupted, It means.. data is available thru Listener.

}
// Thread had sleep for THREAD_SLEEP_TIME , but Still data is not available
If (GPS or Network data isnt available thru GPS listener or Network Listener ) {
   // Do try for one more time.

}
}

Теперь мой код прослушивателя OnLocationChanged выглядит следующим образом:

public void onLocationChanged(Location location) { 

// Listener got location 
// First Intrupt the sleeping Thread
mWorker.interrupt();

if ( loc != null )
{
  //get Location
}

}

Сейчас моя проблема, когда я запускаю этот код, Worker Thread никогда не вызывает OnLocationChanged Listener.

Я вставил looper.Loop() в рабочий поток, вызывается OnLocationChanged. Но он работает непрерывно и looper нетполучить остановку. Как мне остановиться looper.loop()?

Есть ли какой-нибудь другой способ, которым я могу управлять моей вышеупомянутой задачей, кроме workerThread. Если вам нужно большеуточнение, просто дайте мне знать.

1 Ответ

0 голосов
/ 26 января 2011

Не используйте Thread.sleep () в основном потоке. Вы блокируете его от запуска. Нет необходимости иметь отдельный поток для того, что вы делаете, вам просто нужно позволить вашему основному потоку продолжить работу, чтобы вы могли обрабатывать события с помощью обратных вызовов по мере их поступления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...