我有一項服務,它通過一段時間檢查數據庫以檢查GPS是否存在有效需求。如果有使用情況,則會啓動GPS位置更新。我嘗試使用不同的線程,但它會導致應用程序掛起。我發現應用程序在後臺做得更好。服務中的異步任務中的位置管理器
我不斷收到以下錯誤
無法創建內螺紋處理程序尚未調用 Looper.prepare()。
我嘗試使用Looper,但我只是出於某種原因,似乎無法找到正確的方式來實現它。我需要一隻手讓給PingListener,不會跑,我也通過增加
Looper.prepare();
在gpsPlotter While循環之前刪除錯誤。
請忽略我留下的所有日誌和一些垃圾變量,因爲我喜歡在編碼時跟蹤所有內容。
public class PingListener implements LocationListener{
public void onLocationChanged(Location pointer) {
// TODO Auto-generated method stub
String lat = String.valueOf(pointer.getLatitude());
String longi = String.valueOf(pointer.getLongitude());
new pingThread().execute(lat, longi);
Log.d("Updating", "Sending Updates");
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
private class pingThread extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... args) {
// TODO Auto-generated method stub
BeaconHandler db = new BeaconHandler(Ping.this);
List<Beacon> beacons = db.getAllBeacons();
int activecheck = 0;
for(Beacon bn : beacons){
activecheck = activecheck + bn.getStatus();
}
Log.d("Active Result", String.valueOf(activecheck));
String ger = "";
String postresponse = "";
try{
HttpClient retCode = new DefaultHttpClient();
HttpPost retEmail = new HttpPost("http://www.site.com/tracker/return.php");
List<NameValuePair> createValuePairs = new ArrayList<NameValuePair>();
createValuePairs.add(new BasicNameValuePair("vert", args[0]));
createValuePairs.add(new BasicNameValuePair("horz", args[1]));
createValuePairs.add(new BasicNameValuePair("id", "2"));
retEmail.setEntity(new UrlEncodedFormEntity(createValuePairs));
// Execute HTTP Post Request
ResponseHandler<String> createresponseHandler = new BasicResponseHandler();
postresponse = retCode.execute(retEmail, createresponseHandler);
ger = "Network Details\nLat:" + args[0] + "\nLong:" + args[1];
Log.d("Sent: ", ger);
}
catch(Exception e){
Log.e("Error", e.getMessage());
Log.getStackTraceString(e);
}
return ger;
}
protected void onPostExecute(String value){
}
}
private class gpsPlotter extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
int updateset = 0;
//Looper.prepare();
while(true){
try{
BeaconHandler dbg = new BeaconHandler(Ping.this);
List<Beacon> beacons = dbg.getAllBeacons();
int activecheck = 0;
for(Beacon bn : beacons){
activecheck = activecheck + bn.getStatus();
}
//db.close();
if(activecheck > 0 && updateset == 0){
pinger.requestLocationUpdates(LocationManager.GPS_PROVIDER, 600, 0, reciever);
updateset = 1;
Log.d("GPS RESET", "Listener Set");
}
else if(activecheck == 0 && updateset == 1){
pinger.removeUpdates(reciever);
updateset = 0;
Log.d("GPS RESET", "Listener Removed");
}
else{
Log.d("GPS RESET", "No Modifications");
}
Thread.sleep(20000);
}
catch(Exception e){
Log.e("GPS RESET ERROR", e.getMessage(), e);
}
}
}
}
你們有一個很好的參考,我利用後把一個Looper.loop()? – TheHamstring
使用Intent Service比doinbackground更好。這個答案確實缺乏一些可以幫助我更快解決問題的重要信息。我確實改變了我的方法,並使用下面提供的參考切換到意向服務。 http://androidresearch.wordpress.com/2012/03/04/working-with-services-in-android-intentservice/ – TheHamstring