【问题标题】:Use Asynctask to display a ProgressBar in AndroidAndroid中使用Asynctask显示ProgressBar
【发布时间】:2014-04-10 12:36:55
【问题描述】:

我正在尝试显示 ProgressBar。

我是 Android 初学者。

当我按下按钮时,任务应该在后台运行,但它不显示 ProgressBar。

什么是问题?看不懂。

请帮帮我!

主活动:

package com.example.shikkok_services;

import java.util.ArrayList;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {


    private Button btnThread,btntask;
    private ProgressDialog pd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnThread=(Button)findViewById(R.id.btnStartThread);
        btntask=(Button)findViewById(R.id.btntsk);

        btntask.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {


                //start myTast

                new MyTask(MainActivity.this).execute();


            }
        });



    }

}

我的任务:

 package com.example.shikkok_services;

import android.app.Dialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MyTask extends AsyncTask<Void, Integer, Void> {

    Context context;
    Handler handler;
    Dialog dialog;
    TextView txtprogrss;
    ProgressBar progress;
    Button btnCancel;

    MyTask(Context context, Handler handler){
        this.context=context;
        this.handler=handler;

    }

    MyTask(Context context){
      this.context=context;
      this.handler=handler;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
        // create dialog
        dialog=new Dialog(context);
        dialog.setCancelable(true);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.pogressdialog);
        txtprogrss=(TextView) dialog.findViewById(R.id.txtProgress);
        progress=(ProgressBar)dialog.findViewById(R.id.progressBar2);
        btnCancel=(Button)dialog.findViewById(R.id.btnProgress);

        btnCancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                MyTask.this.cancel(true);
            }
        });


    }


    @Override
    protected Void doInBackground(Void... arg0) {


        for (int i = 0; i < 100; i++) {
            if(isCancelled()){
            break;
            }else{
            Log.e("In Background","current value;"+ i);
            publishProgress(i);

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            }

        }

        return null;    
    }

    @Override
    protected void onProgressUpdate(Integer... values) {


        super.onProgressUpdate(values);


        progress.setProgress(values[0]);
        txtprogrss.setText("progress update"+ values[0]+"%");

    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);


        dialog.dismiss();
        Toast.makeText(context, "Finished", Toast.LENGTH_LONG).show();

    }





}

【问题讨论】:

  • 这里为什么用Progress Bar?改用ProgressDialog
  • 使用进度对话框并设置样式,如 progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

标签: java android android-progressbar


【解决方案1】:

您忘记拨打onPreExecute()dialog.show()

【讨论】:

    【解决方案2】:

    您没有在AsyncTaskonPreExecute 方法中调用dialog.show()

    【讨论】:

    • 谢谢@Tim bro.. 没关系,但取消按钮不起作用请告诉我什么问题...
    • 当 AsyncTask 被取消时,会调用 onCancelled() 方法而不是 onPostExecute()。所以你也应该处理关闭对话框并在 onCancelled() 中设置适当的结果。
    【解决方案3】:

    使用ProgressDialog。在这种情况下,您不需要任何布局。

    ProgressDialog progressDialog = new ProgressDialog(context);
    

    onPreExecute显示它

    progressDialog.show();
    

    并在onPostExecute 驳回它

    progressDialog.dismiss();
    

    【讨论】:

      【解决方案4】:

      添加到 OnPostExecute 方法:

      pg.setVisibility(View.INVISIBLE);
      

      添加到 onPreExecute 方法:

      pg.setVisibility(View.VISIBLE);
      

      在布局文件中,您应该添加到进度条:

      android:visibility="invisible" 
      

      【讨论】:

        【解决方案5】:

        您创建了对话框,但没有在任何地方显示它。您的 onPreExecute() 应如下所示:

        @Override
        protected void onPreExecute() {
        
            super.onPreExecute();
            // create dialog
            dialog=new Dialog(context);
            dialog.setCancelable(true);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(R.layout.pogressdialog);
            txtprogrss=(TextView) dialog.findViewById(R.id.txtProgress);
            progress=(ProgressBar)dialog.findViewById(R.id.progressBar2);
            btnCancel=(Button)dialog.findViewById(R.id.btnProgress);
        
            btnCancel.setOnClickListener(new OnClickListener() {
        
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
        
                    MyTask.this.cancel(true);
                    dialog.dismiss();  //On button click cancel AsyncTask and dismiss dialog
                }
            });
            dialog.show();  //Show the dialog
        }
        

        您还需要在单击 btnCancel 时关闭对话框。

        【讨论】:

          猜你喜欢
          • 2016-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-06
          • 2021-12-16
          • 1970-01-01
          • 2014-02-27
          • 2014-05-11
          相关资源
          最近更新 更多