Вы пытаетесь запустить обработчик событий Android, например onLocationChanged, в новом созданном вами потоке. В методе «run ()» класса потока вам нужно вызвать Looper.prepare (), зарегистрировать обработчик события, а затем вызвать Looper.loop (). Когда вы закончите с потоком, вызовите метод Looper.myLooper (). Quit () для выхода.
Пример:
public class MyActivity extends Activity {
private Thread thread = new ThreadClass();
private static Looper threadLooper = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Begin the location reading thread.
thread.start();
// do UI stuff in here
// never sleep in UI thread. Example only.
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// end the thread.
threadLooper.quit();
// quit the activity
this.finish();
}
private class ThreadClass extends Thread {
@Override
public void run() {
Looper.prepare();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
MyLocationListener locListen = new MyLocationListener();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, locListen);
threadLooper = Looper.myLooper();
Looper.loop(); // loop until "quit()" is called.
// remove the update listener to prevent the locationManager from calling it.
locationManager.removeUpdates(locListen);
}
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
/* Do very intensive work here */
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
}