【问题标题】:Issue with onLocationChanged(Location loc) & ASync Task in AndroidAndroid中的onLocationChanged(Location loc)和异步任务问题
【发布时间】:2011-03-09 18:55:03
【问题描述】:

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

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

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

/*
afaik, this is the code that does the internet stuff, that lags the 
UI.  If I put this in doinbackground, it cannot access mylat & my long, 
and the "loc.getLatitude" has to be done in the "onLocationChanged" 
method, which HAS to exist. If I leave the ListAddress code outside the 
doinbackground, everything works, BUT the UI will obviously lag.
*/
List<Address> addresses = geoCoder.getFromLocation(mylat,mylong, 1); 

谁能建议在 doinbackground 方法中获取mylat = loc.getLatitude(); &amp; mylat = loc.getLatitude(); 的最佳方法?

【问题讨论】:

    标签: android android-asynctask reverse geocode


    【解决方案1】:
    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); 调用它

    【讨论】:

    • 我试过这个。有错误。不过听起来可行。这是我的代码。 (mylat 和 mylong 是全局声明的,它们有两个单独的 get 方法,所以另一个类 可以得到它们)pastebin.com/9b8Q3mFc
    • 你的 AsyncTask 应该是另一个类,不要在你的主类中继承它。内部类示例:pastebin.com/2F0NEbUh
    • 得到了这个 Redh3ad,感谢您的帮助。连续把我逼上墙大约 3 天!
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢弗洛,是的,我确实需要位置监听器。异步任务工作得很好,但是因为在 sms 消息中发送地址的类看不到 mylat=loc.getLatitude(); (在特殊需要的方法 onLocationChanged 中)sms 类似乎只能看到全局的 null mylat/mylong 变量,因此在从主类调用 mylat/mylong 的 get 方法时无法解析地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多