当我按下按钮开始获取位置时,立即出现toast消息并显示lat:0 lon:0(初始值)。
几秒钟后,我必须再次按下按钮以获取位置,然后显示位置。
我能为此做些什么?
(据我了解,如果我使用延迟,则无法解决问题。我希望Toast留言等到我到达该位置)
if(gps.canGetLocation()){
latitude = gps.getLatitude();
longitude = gps.getLongitude();
Toast.makeText(getApplicationContext(), "Your Location is \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
...
我用过像:
private void showToast() {
new Thread() {
public void run() {
try {
while (message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(gps.canGetLocation()){
latitude = gps.getLatitude();
longitude = gps.getLongitude();
Toast.makeText(getApplicationContext(), "Your Location is \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
message=false;
}else{
gps.showSettingsAlert();
}
});
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
但它似乎没有用。还有,有没有办法在找到位置之前显示另一条消息?
答案 0 :(得分:0)
正如codeMagic所说,使用不同的线程来继续检查。 GPS需要时间来修复。
也许您可以在应用运行时查看管理GPS修复的Service
。
答案 1 :(得分:0)
对于这样的事情,最好使用AsyncTask
,恕我直言。如果您想在另一个Actviity
或应用程序中使用它,它将使其更加通用和便携。这是一个如何运作的快速示例
public class GetGPSData extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(String... params) {
//do your work here
if(gps.canGetLocation())
{
latitude = gps.getLatitude();
longitude = gps.getLongitude();
}
while (latitude == 0 || longitude ==0)
{
Thread.sleep(300); // let the background thread sleep
}
return something;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// do something with data here-display it or send to mainactivity
Toast.makeText(context, "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
}
其中一些可能需要根据您放置它的位置以及您使用它做什么来修改,但这样的事情会起作用。您还可以在获取数据时显示progress dialog
,以便用户知道它正在加载
修改强>
这只是一个粗略的例子。您可以根据需要更改参数。 doInBackground()
不能params
。只需将其更改为
Void doInBackground(Void... params) {
并将您的班级声明更改为
extends AsyncTask<Void,Void,Void>
并且您不直接调用该方法。你做了像
这样的事情GetGPSData gps = new GetGPSData(); could send params to a constructor if you needed
gps.execute(); // could put params here if you needed for doInBackground()
请务必查看AsyncTask Docs有关您需要了解的信息,但一旦获得这些信息,生活就会轻松得多。