2012-01-30 115 views
0

我試圖讓我的應用程序等待,直到找到當前位置。我嘗試了幾種不同的方式使用Threads,並且都失敗了。我正在使用wait()notify(),但應用程序只是掛起,從未找到當前位置。Android:使應用程序等待,直到找到當前位置

我沒有使用谷歌地圖API,因爲它不是應用程序的一部分。有沒有人有任何想法如何做到這一點或例子。

編輯:我用沒有啓動,直到用戶內的其它onLocationChanged數據處理例如按下按鈕然後Thread將新位置添加到ArrayList,計算當前位置和最後位置之間的距離以及到達新位置所用的時間。

+0

您是否將GPS與LocationManager,LocationListener,e TC?我問,因爲很難理解你爲什麼不把你的代碼放到LocationListener.onLocationChanged()中,這是在找到當前位置時調用的。 – 2012-01-30 21:05:14

+0

是的我有locationManager等工作,但當用戶按下按鈕來獲取位置我希望它等到當前的位置被發現之前發生任何事情或其他事情會發生。我應該在問題中包含這些細節。 – 2012-01-30 21:22:45

回答

2

您可以嘗試在onCreate開始AsyncTask以獲取位置。您的默認onCreate佈局可能是一個「加載」頁面,然後當您的AsyncTask成功完成時,它會繪製您的「真實」UI。

+0

很新的AsyncTask的東西,但很確定它會在OnClick而不是onCreate上工作。這只是想要做到這一點,也許會帶來一個進度對話框或類似 – 2012-01-30 21:03:58

0

所以,如果我明白你想要做的正確,那麼我會避免在onClick()另一個線程。相反,onClick()應該只是請求一個位置,顯示進度對話框並返回。由於您想要做的工作發生在您收到新位置後,我會在那裏啓動一個AsyncTask。然後,當AsyncTask完成時,最終移除對話框(將其移除並將控制權交還給用戶)。

代碼通常會有所幫助,所以,我會把這onCreate()或其它地方:

button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     listener.refresh(); 
    } 
}); 

,並把這個在您的LocationListener的:

public void refresh() { 
    myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
    myDialog = new ProgressDialog(myContext); 
    myDialog.setIndeterminate(true); 
    myDialog.show(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // now do work with your location, 
    // which your probably want to do in a different thread 
    new MyAsyncTask().execute(new Location[] { location }); 
} 

然後你需要一個的AsyncTask,它可能看起來像這樣:

class MyAsyncTask extends AsyncTask<Location, Void, Void> { 
    @Override 
    protected Void doInBackground(Location... location) { 
     // start doing your distance/directions/etc work here 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Void v) { 
     // this gets called automatically when you're done, 
     // so release the dialog box 
     myDialog.dismiss(); 
     myDialog = null; 
    } 
} 
+0

排序,我只想要線程/ asyncTask運行一次找到設備的初始位置後,將只使用'onLocationChanged'提供所有後來的地點。由於這個事實,如果我使用'getLastKnownLocation(String provider)',它可能會把相當大的錯誤的距離。 – 2012-01-31 00:28:15

+0

@Droid_Interceptor是的,'getLastKnownLocation()'有時會變得很舊(比如24小時的舊數據)。但我不確定你需要線程/'AsyncTask'。只需調用'requestLocationUpdates()'。當你有位置時,Android會調用'onLocationChanged()'。 Android使用的回調系統的目的是你不需要線程來等待。 'AsyncTask'用於做有效的工作,而不是等待GPS。 – 2012-01-31 16:23:32

+0

謝謝@Steve Blackwell我想我只是需要再次破解它,昨晚讓它有些沮喪。認爲主要的問題可能是LocationListener被實現爲一個獨立的類而不是一個內部類,因此它與Activity分離,因此在獲取位置之前調用getCurrentLocation()方法返回null。 – 2012-01-31 16:47:35

相關問題