2011-11-15 38 views
0

在線程中調用的方法內訪問位置服務時,我的應用程序崩潰。我從線程正在運行的服務中傳遞上下文,但它不起作用。將調用的上下文傳遞給「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) 

回答

0

看着堆棧跟蹤,看起來像你的startLocationObserver()方法調用的LocationManager的requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法(一個沒有活套參數)。

看看你是否可以用Looper參數調用requestLocationUpdates()版本,而不是傳遞Looper.getMainLooper()

或者,請參閱此blog post,其中解決方法是致電Looper.myLooper().prepare()

0

從谷歌上快速搜索,似乎工作線程沒有活套與之相關聯,因此您可運行可能會嘗試張貼在無法處理這些線程的消息。嘗試將相同的Runnable發佈到您的UI線程中,並查看錯誤是否仍然存在。

來源:

Can't create handler inside thread which has not called Looper.prepare()

+0

它在擴展「IntentService」的類中工作過。這應該和UI線程一樣。所以這是關於Looper.prepare()。我怎樣才能解決這個問題?我應該在線程的run()方法中調用「Looper.prepare()」嗎? – Reymanx

+0

是的,你可以試試。如果這不起作用,請先嚐試使用Looper.myLooper()明確獲取線程的Looper。最後將嘗試應用程序的主要Looper。 Looper類的Android文檔實際上解釋了這個相當好的IMO。 – ACrazyOldMan

0

獲取對onStartCommand()(主/ UI線程)中LocationService的引用,並將其傳遞給您的線程。

爲什麼你不想使用IntentService?它負責在單獨的線程上運行代碼,並在完成時關閉它。

+0

非常感謝!對於我通過requestLocationUpdates傳遞Looper確實有效。我使用了服務,因爲服務和服務中有一個週期性的動作,只有開始/停止,但沒有其他交互發生。 – Reymanx

+0

如果是定期操作,使用'IntentService'仍然是個好主意。您可以使用'AlaramManager'定期啓動它。 –

相關問題