我想在等待GPS信号建立时有一个进度条。
我使用:
public class GetGPSData extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPreExecute() {
//super.onPreExecute();
myprogressBar.setVisibility(View.VISIBLE);
myprogressBar.setProgress(0);
}
@Override
protected void onProgressUpdate(Integer... progress) {
//super.onProgressUpdate(progress);
myprogressBar.setProgress(progress[0]);
}
@Override
protected Void doInBackground(Void... params) {
latitude = gps.getLatitude();
longitude = gps.getLongitude();
while (latitude == 0 || longitude ==0)
{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
protected void onCancelled() {
Toast.makeText(getBaseContext(), "Error connecting", Toast.LENGTH_LONG).show();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
myprogressBar.setProgress(100);
Toast.makeText(getBaseContext(), "Your Location is nLat: " + latitude + "nLong: " + longitude, Toast.LENGTH_LONG).show();
}
}
:
<ProgressBar android:id="@+id/myprogressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:indeterminate="true"
android:layout_below="@+id/comments"
android:padding="5dp" />
但是进度条仍然是空的。
另外,当我点击按钮,以便开始获得GPS信号,GPS闪烁,然后停止闪烁(但同时它仍然搜索信号),当我再次按下它给我吐司消息我在onPostExecute。这是正常行为吗?
图标不应该闪烁,直到找到信号,然后显示给我的消息,而不需要用户再次按下按钮?
-------------------------------- 更新 ----------------------------------------------------
我还尝试了ProgressDialog:
public class GetGPSData extends AsyncTask<Void, Integer, Void> {
ProgressDialog progressDialog = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(ShowList.this);
progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
GetGPSData.this.cancel(true);
}
});
progressDialog.setMessage("Waiting for location...");
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(true);
progressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected Void doInBackground(Void... params) {
latitude = gps.getLatitude();
longitude = gps.getLongitude();
while (latitude == 0 || longitude == 0)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
protected void onCancelled() {
Toast.makeText(getBaseContext(), "Cancelled/Error connecting", Toast.LENGTH_LONG).show();
progressDialog.dismiss();
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
Toast.makeText(ShowList.this, "Your Location is nLat: " + latitude + "nLong: " + longitude, Toast.LENGTH_LONG).show();
}
}
但是现在进度对话框永远不会停止加载。如果我按后退键,然后再按下按钮来获取位置,那么它会给我toast消息(带有位置)。
------------------- 解决方案 ------------------------------
问题是(在纠正while循环之后)你必须输入this.location=location
public void onLocationChanged(Location location) {
this.location=location;
}
在doInBackground
方法中使用publishProgress
但在你的情况下,你不应该使用水平的ProgressBar
值,因为你不知道什么时候你的经纬度是已知的,只是使用一个简单的ProgressBar
。
你的进度条是空的,因为你没有在doInBackground()方法中调用publishProgress()方法。在asynctask中调用onProgressUpdate()方法
当doInBackground回调运行到结束时调用onPostExecute回调。如果未调用,则表示
while (latitude == 0 || longitude == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
latitude = gps.getLatitude();
longitude = gps.getLongitude();
}
Log.e(getClass().getSimpleName(), "out the while");
latitude
和longitude
的值都不等于!= 0;
如果你的while
循环永远不会结束,你会泄漏你的AsyncTask
您的进度没有被发布的原因是因为您没有在doInBackground
函数中调用publishProgress()
。另外,你的GPS图标停止闪烁的原因是因为你有GPS信号。你的应用说它仍在搜索GPS信号的原因是因为你的while循环条件从未更新,所以你的循环从未结束。当你再次按下按钮时,toast就会显示出来,因为第二个AsyncTask
正在启动并且马上完成。
要解决所有这些问题,您需要更新doInBackground
函数,使其看起来像这样:
@Override
protected Void doInBackground(Void... params) {
do {
latitude = gps.getLatitude();
longitude = gps.getLongitude();
/* Not needed for an indeterminate progress bar */
publishProgress(0);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
} while (latitude == 0 || longitude == 0);
return null;
}
这将持续寻找gps修复,并在实现修复时正确地跳出循环。它还将调用onProgressUpdate
来更新您的进度。这里唯一需要注意的是,您需要自己决定将使用什么作为进度。我在这里把它写成0,这样你就可以看到在哪里调用它了,但是在不知道你用什么来衡量进度的情况下,我不能明确地说什么最适合你。
在您的情况下,不确定的进度条可能比具有最小/最大的进度条更好。我看到你已经在ProgressDialog
的例子中这样做了,所以我只是删除上面代码中的publishProgress
行,然后继续使用第二个例子。