使用asynctask - EDIT -对话框永远不会停止加载,进度条仍然为空



我想在等待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");

latitudelongitude的值都不等于!= 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行,然后继续使用第二个例子。

相关内容

  • 没有找到相关文章

最新更新