问题与onLocationChanged(位置loc)& Android中的ASync任务

时间:2011-03-09 18:55:03

标签: android android-asynctask reverse geocode

我有一个连接到互联网的Android应用程序,可以在lat和long坐标上实时进行反向地理编码。这滞后于UI并且可能导致它“无响应 - 强制关闭/等待”错误(正如预期的那样,不使用异步/线程处理程序!)

我已经实现了一个非常好的异步任务(不再有UI延迟!),但是在onLocationChanged方法中设置的变量(将它们设置为纬度和经度)是不可访问的。 我正在这样做的类,链接到另一个传递变量的单独类,并且可以向包含反向地理编码地址的人发送短信。 但是,由于使用doinbackground方法实现异步任务,我无法再发送我需要的内容。我不知道我能否解释得更好,我会提供示例代码。

public void onLocationChanged(Location loc){                              mylat = loc.getLatitude();                              mylong = loc.getLongitude(); }

列表地址= geoCoder.getFromLocation(mylat,mylong,1); // afaik,这是做网络内容的代码,它落后于用户界面。如果我把它放在doinbackground中,它就无法访问mylat&我的长,并且“loc.getLatitude”必须在“onLocationChanged”方法中完成,该方法必须存在。如果我将ListAddress代码保留在doinbackground之外,一切正常,但UI显然会滞后。

任何人都可以建议获得mylat = loc.getLatitude()的最佳方法; &安培; mylat = loc.getLatitude();在doinbackground方法里面?

2 个答案:

答案 0 :(得分:3)

  1. 覆盖AsyncTask的构造函数,并将mylatmylong设置为该类中的变量
  2. 或直接将它们传递给doInBackground方法。

    ... extends AsyncTask<Double, ProgressType, ReturnType> {
        protected ReturnType doInBackground(Double... params) {
            mylat = params[0];
            mylong = params[1];
            List addresses = geoCoder.getFromLocation(mylat, mylong, 1);
            ...
        }
        ...
    }
    

    并使用execute(mylat, mylong);

  3. 进行调用

答案 1 :(得分:1)

您可以通过mylatmylong作为参数来覆盖AsyncTask类的构造函数。在构造函数中,您将参数保存为AsyncTask的成员变量。这样做,您应该能够在doInBackground()方法中访问它们。

另一件事是,你应该考虑一下你是否真的需要一个位置监听器。如果您在某些时刻只需要当前位置,那么LocationManager及其方法getLastKnownLocation()也可以完成这项工作。然后,您还可以确定doInBackground()方法中的当前位置。但请阅读getLastKnownLocation()的文档,如果它真的符合您的需求。如果每次设备移动时都需要更新,则必须使用位置监听器。