1

ボタンを押して場所の取得を開始すると、すぐにトースト メッセージが表示され、lat:0 lon:0 (初期化された値) が表示されます。

数秒後、ボタンをもう一度押して場所を取得する必要があり、場所が表示されます。

そのために何ができますか?

(私が理解しているように、遅延を使用しても問題は解決しません。場所を取得するまでトーストメッセージを待機させたい)

 if(gps.canGetLocation()){

 latitude = gps.getLatitude();
 longitude = gps.getLongitude();

    Toast.makeText(getApplicationContext(), "Your Location is  \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                    ...

私はsthを次のように使用しました:

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

また、場所が見つかるまで別のメッセージを表示する方法はありますか?

4

2 に答える 2

0

codeMagic が言ったように、別のスレッドを使用してチェックを続けます。GPS の修正には時間がかかります。

Serviceアプリの実行中に GPS 修正を管理する を調べることができるかもしれません。

于 2013-05-04T13:49:14.093 に答える
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 ドキュメントには、理解する必要がある情報がありますが、一度理解すれば、作業はずっと簡単になります。

于 2013-05-04T14:27:02.947 に答える