我有一个连接到互联网的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方法里面?
答案 0 :(得分:3)
mylat
和mylong
设置为该类中的变量或直接将它们传递给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);
答案 1 :(得分:1)
您可以通过mylat
和mylong
作为参数来覆盖AsyncTask类的构造函数。在构造函数中,您将参数保存为AsyncTask的成员变量。这样做,您应该能够在doInBackground()方法中访问它们。
另一件事是,你应该考虑一下你是否真的需要一个位置监听器。如果您在某些时刻只需要当前位置,那么LocationManager及其方法getLastKnownLocation()也可以完成这项工作。然后,您还可以确定doInBackground()方法中的当前位置。但请阅读getLastKnownLocation()的文档,如果它真的符合您的需求。如果每次设备移动时都需要更新,则必须使用位置监听器。