2013-08-06 104 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()。 –