2011-03-09 48 views
0

我有一个连接到互联网的android应用程序,可以实时对经纬度和长坐标进行反向地理编码。这延迟了用户界面,并可能导致它给出“没有响应 - 强制关闭/等待”错误(正如所料,不使用异步/线程处理程序!)Android onLocationChanged(位置loc)&ASync任务问题

我已经实现了一个异步任务,工作得很好UI滞后!),但在onLocationChanged方法中设置的变量(将它们设置为纬度&经度)是无法访问的。 我正在这样做的课程与另一个能够传递变量的独立课程相关联,并且可以将短信发送给包含反向地理编码地址的人。 但是,自从使用doinbackground方法实现异步任务以来,我无法再发送我需要的东西。我不知道我能否更好地解释,我会提供示例代码。

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

列表地址= geoCoder.getFromLocation(mylat,mylong,1); // afaik,这是互联网的代码,这滞后于用户界面。如果我把它放在doinbackground中,它就不能访问mylong &我的长时间,并且“loc.getLatitude”必须在需要存在的“onLocationChanged”方法中完成。如果我将ListAddress代码放在doinbackground之外,一切都可以正常工作,但UI显然会滞后。

任何人都可以建议获取mylat = loc.getLatitude(); & mylat = loc.getLatitude();在doinbackground方法里面?

回答

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

+0

我试过了。有错误。尽管这听起来可行。这是我的代码。(mylat和mylong是全局声明的,并且有两种独立的get方法,所以发送短消息的其他类可以获得它们)http://pastebin.com/9b8Q3mFc – GrumP

+0

我在哪里调用execute? – GrumP

+1

你的AsyncTask应该是另一个类,不要在你的主类中继承它。内部类的示例:http://pastebin.com/2F0NEbUh – red

1

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

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

+0

感谢弗洛称呼它,是的,我确实需要的位置监听器。异步任务很好,但是因为发送短消息地址的类不能看到mylat = loc.getLatitude(); (这是特殊的必需方法onLocationChanged),sms类似乎只能看到全局空mylat/mylong变量,因此当从主类调用mylat/mylong的get方法时无法解析地址。 – GrumP