在获取GPS位置之前显示toast

时间:2013-05-04 13:29:40

标签: android

当我按下按钮开始获取位置时,立即出现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();
               }        

但它似乎没有用。还有,有没有办法在找到位置之前显示另一条消息?

2 个答案:

答案 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有关您需要了解的信息,但一旦获得这些信息,生活就会轻松得多。