【问题标题】:Location Manager inside Async Task from Service来自服务的异步任务中的位置管理器
【发布时间】:2013-08-06 02:14:39
【问题描述】:

我有一项服务可以在一段时间内检查数据库,以检查是否存在对 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);
            }
        }
    }       
}

【问题讨论】:

    标签: android service android-asynctask locationmanager


    【解决方案1】:

    使用IntentService 而不是AsyncTask

    【讨论】:

    • 使用 Intent 服务比 doinbackground 更好。这个答案确实缺少一些可以帮助我更快解决问题的重要信息。我确实改变了我的方法,并使用下面提供的参考切换到了意图服务。 androidresearch.wordpress.com/2012/03/04/…
    【解决方案2】:

    你需要在while循环之后放一个 Looper.loop()

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

    }

    【讨论】:

    • 这行不通,因为我在 While 循环中处理的是 true。我现在知道我的一些问题来自哪里。
    • 你必须在你的循环中的某处放一个中断,但你仍然需要 Looper.loop() 最后;
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2011-08-15
    • 2018-07-19
    相关资源
    最近更新 更多