2013-08-06 73 views
0

我有一項服務,它通過一段時間檢查數據庫以檢查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); 
      } 
     } 
    }  
} 

回答

0

使用IntentService而不是AsyncTask

+0

你們有一個很好的參考,我利用後把一個Looper.loop()? – TheHamstring

+0

使用Intent Service比doinbackground更好。這個答案確實缺乏一些可以幫助我更快解決問題的重要信息。我確實改變了我的方法,並使用下面提供的參考切換到意向服務。 http://androidresearch.wordpress.com/2012/03/04/working-with-services-in-android-intentservice/ – TheHamstring

0

您需要while循環

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(); 
}  

}

+0

這將無法正常工作,因爲我在我的While循環中處理了一個true。我現在看到我的一些問題來自哪裏。 – TheHamstring

+0

你必須在你的循環中放一個地方,但最後還是需要Looper.loop()。 –