【问题标题】:ProgressDialog not working properly in an AsyncTaskProgressDialog 在 AsyncTask 中无法正常工作
【发布时间】:2014-07-07 01:49:51
【问题描述】:

在尝试通过@Slartibartfast 的回答暗示How to show ProgressDialog across launching a new Activity? 时,我试图让它在我的编辑器中工作但没有成功。在这里,我试图在程序获取一些联系人信息时显示一个响铃 progressDialog。然后,稍后,在 OnCreate 中,它把它放在 ListView 中。我的问题是没有progressDialog 出现过。我的代码如下:

声明

private ProgressDialog ringProgressDialog = null;

AsyncTask - 启动并结束环形progressDialog

private class load_contact_list extends AsyncTask<String, Void, Integer> {

    @Override
    protected Integer doInBackground(String... url) {

       ...
    }

    @Override
    protected void onPostExecute(Integer list_length) {
        ringProgressDialog.dismiss();
        setContentView(R.layout.activity_main);
    }
}

创建时

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ringProgressDialog = ProgressDialog.show(MainActivity.this, "Loading contacts", "Please Wait", true);

    new load_contact_list().execute(...);
    }
  ...

我尽最大努力使我的代码与他的代码相似,但我不知道为什么它不起作用。提前致谢。

编辑: doInBackground() 中的省略号集是获取联系信息的位置。另一组,在 OnCreate 中,是将信息放入列表的位置。

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

    看起来问题出在您以创建方式创建 ProgressDialog 时。此外,最好在 AsyncTask 类中的 onPreExecute() 方法中启动 ProgressDialog

    1。为您的 AsyncTask 创建一个构造函数

    为您的AsyncTask 类创建一个构造函数,这样您就可以通过类实例化发送上下文引用,并在您的AsyncTask 类中声明ProgressDialog

    private class load_contact_list extends AsyncTask<String, Void, Integer> 
    {
        private Activity mActivity;
        private Context mContext;
        private ProgressDialog mDialog;
    
        // Constructor
        public ProgressTask(Activity activity) 
        {
            this.mActivity= activity;
            mContext= activity;
    
            // Here we create a new instance of the ProgressDialog with the context   received as parameter
            mDialog= new ProgressDialog(mContext);
        }
    
        protected void onPreExecute() 
        {
            // We use the ProgressDialog object instantiated in this class's constructor
            this.mDialog.setMessage("Loading contacts");
            this.mDialog.show();
        }
    
        @Override
        protected Integer doInBackground(String... url) 
        {
            // ...
        }
    
        @Override
        protected void onPostExecute(Integer list_length) 
        {
            // Here we dismiss the ProgressDialog created in this class's constructor
            if(mDialog.isShowing())
            {
                this.mDialog.dismiss();
            }
            setContentView(R.layout.activity_main);
        }
    }
    

    2。执行 AsyncTask 也发送活动的上下文

    现在,在您的活动onCreate() 方法中,您执行AsyncTask,并且不要忘记通过AsyncTask 构造函数发送活动的上下文。

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
    
        // Execute the AsyncTask class by sending the context by parameter via its constructor
        new load_contact_list(this).execute();
    }
    

    希望对你有帮助。

    【讨论】:

    • 根据您的建议,现在会出现进度对话框,但是很晚,似乎是在 doInBackground 执行之后(我正在执行 HTTP GET,并且可以在对话框显示前几秒钟看到 GET 到达我的服务器)。我必须在 doInBackground 中插入 2 秒睡眠才能在 onPostExecute 关闭对话框之前看到它。我还将构造函数重命名为 load_contact_list,与我的 AsyncTask 同名。我在 API 19 - 有什么想法吗?感谢您的帮助。
    • 您好@AndroidCoder101001 首先,如果问题解决了您的ProgressDialog 没有显示的问题,请将其设置为正确答案=)。第二,我不明白你想要做什么,你说ProgressDialog显示太快你甚至看不到它?
    • " 第二,我不明白你想要做什么,你说 ProgressDialog 显示得太快,你甚至看不到它?" 正是
    • @AndroidCoder101001 这很正常,如果您的请求没有延迟太多,为什么要强迫它延迟呢? HHAHA 但是,如果您想在请求完成的情况下向用户显示进度(这没有意义),如果这是您的意图,只需休眠 5 秒即可。
    • @AndroidCoder101001 你明白了吗?
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2015-02-14
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多