【问题标题】:Progress Bar is not dismissed进度条未关闭
【发布时间】:2012-09-21 07:48:09
【问题描述】:

我无法关闭我的 Android 应用程序中的进度条。 我声明了一个对象 bar 对象并获取一个调用 doInProgress 函数的字符串,并将一个名为 v1 的对象传递给它。 当异步任务完成他的任务时,为什么进度条(出现 wichs)没有像 onPostExecute 方法中声明的那样被解除?

在我的活动中我调用:

ProgressDialog pDialog;
response = new GetString(SecondActivity.this).execute(v1).get();

这是 myAsync 任务:

package com.gms;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;


public class GetString extends AsyncTask<VariablesTable, Void, String> {

        private Context context;

        public ProgressDialog pDialog;

        public GetString(Context c){
            context = c;
        }           

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(context);
            pDialog.setMessage("Loading..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        protected void onPostExecute() {
            // dismiss the dialog once got all details
            if (pDialog.isShowing()){
                pDialog.dismiss();
            }
        }


        @Override
        protected String doInBackground(VariablesTable... obj) {
            // Making HTTP request
            InputStream is = null;

            try {
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    String paramString = URLEncodedUtils.format(obj[0].cat, "utf-8");
                    obj[0].url += "?" + paramString;
                    HttpGet httpGet = new HttpGet(obj[0].url);

                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();          

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

                BufferedReader reader = null;
                try {
                    reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                StringBuilder sb = new StringBuilder();
                String line = null;
                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return sb.toString();
        }
    }

建议?? 提前致谢

【问题讨论】:

  • 我认为你的异步任务不正常。并且 onPostExecute 没有被调用
  • 问题是:你知道为什么不调用 onPostExecute 吗?
  • 尝试将 onPostExecute() 更改为 onPostExecute(String resp)
  • @FrankBr 我面临同样的问题..你有什么解决方案
  • 下面是解决方案。

标签: android android-asynctask progress-bar


【解决方案1】:

检查后执行,我怀疑它是否有效

尝试将 onPostExecute() 更改为 onPostExecute(String resp)

【讨论】:

    【解决方案2】:

    我认为问题在于您启动 ASyncTask 的方式。

    response = new GetString(SecondActivity.this).execute(v1).get();
    

    如果你从 UI 线程调用它,它会阻塞在那里。删除.get() 部分,以便线程可以继续运行并正确执行您的onPreExecuteonPostExecute 函数。

    【讨论】:

    • 我使用 get() 来获取 GetString 类的字符串响应。我会尝试设置一个全局变量。
    • 全局或在 onPostExecute 中使用该字符串执行您需要的操作...这仍然在 UI 线程上运行。
    • 我删除了 get() 但要关闭进度对话框,我需要触摸屏幕。但我希望它自动被解雇。
    • 你确定 postExecute 函数被执行了吗? logcat 当时是否显示任何类型的警告?
    • 如果您遵循其他答案(setCancellable 为 true),这就是它会做的事情,通过按后退键或点击屏幕,您将能够摆脱该进度条,但是该任务仍在后台进行......它并没有真正解决您的dismiss()调用不起作用的问题......
    【解决方案3】:

    在 onPostExecute() 方法中执行 System.out 以检查控件是否在此方法中到达。如果 onPost 被执行并且对话框没有关闭,那么在 UI 线程中关闭对话框 --- context.runOnUiThread 如果它仍然不起作用,则将 ProgressDialog 设为静态(不是一个解决方案,只是尝试一下),希望它现在会关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多