使用Asynctask在Android中显示ProgressBar

问题描述 投票:1回答:6

我正在尝试显示进度条。

我是Android初学者。

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

是什么问题?我听不懂。

请帮助我!

MainActivity:

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();


            }
        });



    }

}

MyTask:

 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();

    }





}
java android android-progressbar
6个回答
4
投票

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


4
投票

您忘记了在dialog.show()处致电onPreExecute()


2
投票

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

ProgressDialog progressDialog = new ProgressDialog(context);

onPreExecute中显示

progressDialog.show();

并且在onPostExecute中将其关闭

progressDialog.dismiss();

1
投票

添加到OnPostExecute方法:

pg.setVisibility(View.INVISIBLE);

添加到onPreExecute方法:

pg.setVisibility(View.VISIBLE);

并且应该在布局文件中添加到进度条:

android:visibility="invisible" 

1
投票

您创建了对话框,但未在任何地方显示它。您的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时,您还需要关闭该对话框。


0
投票

一个非常简单的活动,拥有我们的async_task布局。现在该在我们的Activity中创建AsyncTask类了。

public class AsyncTaskActivity extends AppCompatActivity {
    ProgressBar progressBar;
    int count = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.async_task);
        progressBar = findViewById(R.id.progressBar);
        new MyTask().execute(10);
    }
    class MyTask extends AsyncTask<Integer, Integer, String> {
        @Override
        protected String doInBackground(Integer... params) {
            for (; count <= params[0]; count++) {
                try {
                    Thread.sleep(1);
                    publishProgress(count);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "Task Completed.";
        }
        @Override
        protected void onPostExecute(String result) {
            Log.d("Over","Over");
        }
        @Override
        protected void onPreExecute() {
            progressBar.setProgress(0);
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            Log.d("Progress", String.valueOf(values[0]));
            progressBar.setProgress(values[0]);
        }
    }
}

资源:https://code-android-example.blogspot.com/2020/02/asynctask-with-progressbar-android.html

© www.soinside.com 2019 - 2024. All rights reserved.