2013-04-02 16 views
0

我正在使用後臺服務獲取特定時間間隔內的位置座標並對數據庫執行更新操作。我已經搜索了許多類似的問題,但沒有幫助。不更新服務線程中的位置

我在服務中創建了線程來執行此操作。 但是我在服務未更新位置時卡住了。我發現方法「requestLocationUpdates()」沒有在線程中調用。事實上,我在線程內使用了Toast方法,也沒有工作。

問題可能在於上述方法中傳入的「上下文」參數。但我無法更正此代碼。

主要關心的是從服務線程獲取準確位置並將其更新到服務器。記下這部分內容,請告訴我正確的代碼或任何其他來源,以更好的方式說明相同的功能。這裏是我的代碼...

public class IcareService extends Service implements LocationListener 
{ 

private Handler mUserLocationHandler = null; 
Thread triggerService; 
LocationManager lm; 
Criteria criteria; 
String provider,lat,lon,rid; 



    @Override 
public void onDestroy() { 
// TODO Auto-generated method stub 
super.onDestroy(); 
Toast.makeText(this, "Stopping Service and so thread...", Toast.LENGTH_SHORT).show(); 
mUserLocationHandler.getLooper().quit(); 
} 


    @Override 
    public IBinder onBind(Intent intent) 
    { 
    //Not implemented...this sample is only for starting and stopping services. 
    //Service binding will be covered in another tutorial 
    return null; 
    } 


    @Override 
    public void onCreate() 
    { 
      super.onCreate(); 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     super.onStartCommand(intent, flags, startId); 
     //Announcement about starting 
     Toast.makeText(this, "Starting Service...", Toast.LENGTH_SHORT).show(); 
     addLocationListener();    
     return START_STICKY; 
    } 




    private void addLocationListener() 
    { 
     triggerService = new Thread(new Runnable(){ 
     public void run(){ 
     try{ 
       Looper.prepare();//Initialise the current thread as a looper. 

       mUserLocationHandler = new Handler(); 

       lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

      // Creating a criteria object to retrieve provider 
      Criteria c = new Criteria(); 
      criteria.setAccuracy(Criteria.ACCURACY_COARSE); 

      // Getting the name of the best provider 
      final String PROVIDER = lm.getBestProvider(c, true); 

     //This 2 below statement not executing...  
      lm.requestLocationUpdates(PROVIDER, 7000, 5, IcareService.this); 
     Toast.makeText(IcareService.this, "Updating Location...", Toast.LENGTH_SHORT).show(); 


      Thread.sleep(7000);      
      Looper.loop(); 
       }catch(Exception ex){ 
        ex.printStackTrace(); 
       } 
      } 
     }, "LocationThreadicare"); 
     triggerService.start(); 
    } 


@Override 
    public void onLocationChanged(Location location) { 
// Getting latitude of the current location 
double latitude = location.getLatitude(); 
lat = Double.toString(latitude); 

// Getting longitude of the current location 
double longitude = location.getLongitude(); 
lon= Double.toString(longitude); 
Toast.makeText(this, "Gt loc nw sendng to srvr", Toast.LENGTH_SHORT).show(); 

    SendtoServer();    

} 


     @Override 
     public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

     } 


    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 


    SendtoServer(){ 
    .............} 
} 
+0

你好aseem,我面臨着類似的問題。你有任何解決方案來解決這個問題?請讓我知道,我從最後一週卡住了這個問題,但沒有運氣。先謝謝你。 –

+0

@ amolsawant96Kuli嗨amol我真的很抱歉沒有回覆,因爲我沒有活躍的用戶3個月.....是我已經解決了這個問題3 mnths回來,但儀式現在我忘了幾乎所有bcz我已經完全改變我的軌道從Android開發人員的職業....即時通訊sooo抱歉。我希望你之前已經解決了這個問題。我只能對你的生活說最好的祝福。 – aseem

回答

0

不要用麪包進行調試(它,順便說一句,需要在UI線程上運行,也稱爲主線程),使用

Log.d("--------","\n\n-------"+Thread.currentThread().getName()+"\n\n"); 

添加這樣的登錄到onCreate()/onDestroy() 和感興趣的地方,你會看到會發生什麼。使用adb logcat查看日誌。