在線程中調用的方法內訪問位置服務時,我的應用程序崩潰。我從線程正在運行的服務中傳遞上下文,但它不起作用。將調用的上下文傳遞給「getSystemService」
這是在服務內創建的線程內對LocationService
的調用。
class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Thread thread = new Thread(){
@Override
public void run() {
try{
geofix = new GeoFixer(getApplicationContext());
geofix.startLocationObserver();
...
}catch (....){}....
的GeoFixer
構造函數的背景和Context context
保存它。
現在在方法startLocationObserver()
中,我調用getSystemService
,這個上下文會使應用程序崩潰。
public class GeoFixer {
...
private Context context;
GeoFixer(Context context){
this.context = context;
}
public void startLocationObserver(){
LocationManager locationManager = (LocationManager)
context.getSystemService(Context.LOCATION_SERVICE);
// This is where it crashes
... }
我在做什麼錯?
編輯:這裏是現在的LogCat。
ERROR/AndroidRuntime(8824): FATAL EXCEPTION: Thread-10
ERROR/AndroidRuntime(8824): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
ERROR/AndroidRuntime(8824): at android.os.Handler.<init>(Handler.java:121)
ERROR/AndroidRuntime(8824): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:173)
ERROR/AndroidRuntime(8824): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:173)
ERROR/AndroidRuntime(8824): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:579)
ERROR/AndroidRuntime(8824): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:446)
ERROR/AndroidRuntime(8824): at de.theapplication.GeoFixer.getNetworkLocation(GeoFixer.java:64)
ERROR/AndroidRuntime(8824): at de.theapplication.GeoFixer.startLocationObserver(GeoFixer.java:27)
ERROR/AndroidRuntime(8824): at de.theapplication.Fadenzieher$1.run(Fadenzieher.java:36)
它在擴展「IntentService」的類中工作過。這應該和UI線程一樣。所以這是關於Looper.prepare()。我怎樣才能解決這個問題?我應該在線程的run()方法中調用「Looper.prepare()」嗎? – Reymanx
是的,你可以試試。如果這不起作用,請先嚐試使用Looper.myLooper()明確獲取線程的Looper。最後將嘗試應用程序的主要Looper。 Looper類的Android文檔實際上解釋了這個相當好的IMO。 – ACrazyOldMan