2010-11-27 53 views
0

在我的應用中,一個活動啓動一個服務。該服務通過onLocatioChanged方法獲取基於網絡的地理位置,並將其寫入共享首選項。然後調用它自己的stopSelf();方法。回到我的活動中,我再次從Shared Prefs中讀取地理位置。更新服務中的地理位置活動時的時間問題(使用共享首選項將服務地理位置從服務傳輸到活動)

我的代碼實際上起作用,唯一的問題是我的Activity從共享首選項讀出的地理位置始終來自服務的私密開始。 服務需要幾毫秒才能獲得地理位置 - 在此期間,活動讀取了過時的(以前的)地理位置。 我搜索了論壇,試圖在新線程中啓動Servive,並在Thread Thread中使用Thread Thread()引入了等待時間。目前爲止沒有任何工作

從我Acivity相關的代碼開始GeoServce.class,並讀取共享偏好設置:

btnGeoPos.setOnLongClickListener (new View.OnLongClickListener(){ 
      public boolean onLongClick(View v) { 

      startService(new Intent(getApplicationContext(), GeoService.class)); 

       SharedPreferences mPrefs = getApplicationContext().getSharedPreferences("CurrentLoc", MODE_PRIVATE); 
      DisplayLoc = mPrefs.getString("LocationTransfer", "not available"); 
      Toast.makeText(getApplicationContext()," GeoService retrieved: "+DisplayLoc, Toast.LENGTH_LONG).show(); 

      return true; //LongClick was consumed     
    }   
    }); 

這是寫入geoposition到SharedPrefs我的服務類,它工作得很好本身:

public class GeoService extends Service { 

Location location = null; 
LocationManager lm; 
LocationListener ll; 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 



    public void onCreate() {   
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     ll = new MyLocationListener();   
     lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,1000, ll);  
     }  



    public void onStart(Intent intent, int startiD){} 

private class MyLocationListener implements LocationListener { 

    public void onLocationChanged(Location location) { 
    String message = String.format("Current Location \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude()); 
    Toast.makeText(GeoService.this, message, Toast.LENGTH_LONG).show(); 

    SharedPreferences mPrefs = GeoService.this.getSharedPreferences("CurrentLoc", MODE_PRIVATE); 
      SharedPreferences.Editor editor1 = mPrefs.edit(); 
    editor1.putString("LocationTransfer", message); // LocationTransfer is the key, message is the content passed  
    editor1.commit(); 

     lm.removeUpdates(ll); 
    stopSelf(); 
    } 

    public void onStatusChanged(String s, int i, Bundle b) {} 

    public void onProviderDisabled(String s) { 
    Toast.makeText(GeoService.this,"Network Location turned off",Toast.LENGTH_LONG).show(); 
    } 

    public void onProviderEnabled(String s) {} 

}// End inner class 

}// End Class 

這個路障讓我搜索自周以來,我會感謝所有幫助, !

回答

0

您有幾種選擇:

  1. 讓你接近異步:讓服務活動通知時,它的完成。您可以使用BroadcastReceiver來實現此目的。

  2. 如果此服務是短暫的並且僅在您的活動內部使用,則不需要服務。改爲使用AsyncTask