Android课堂学习笔记——课后练习

这篇博客详细记录了在Android开发中如何使用AsyncTask和Handler来实现进度条界面和倒计时界面。通过步骤解析,展示了在xml中创建控件、绑定id、设置监听以及在后台线程中更新UI的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用AsyncTask实现进度条界面

步骤

  1. 在xml中创建控件
  2. 在java创建控件对象
  3. 绑定id
  4. 设置监听
  5. 新建一个内部类MyTask继承AsyncTask
  6. 在doInBackground方法中执行耗时操作
  7. 子线程运行中调用onProgressUpdate方法来更新主线程
  8. 耗时操作执行后,调用onPostExecute方法
public class MainActivity extends AppCompatActivity {

    //创建控件对象
    private ProgressBar jdtBar;
    private Button startBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bind();

        //设置监听
        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startBtn.setText("正在下载");//点击时,给Button进行赋值
                startBtn.setEnabled(false);//设置Button不可点击
                new MyTask().execute();//启动AsyncTask任务
            }
        });

    }

    //绑定id
    private void bind() {
        jdtBar = findViewById(R.id.jdt_bar);
        startBtn = findViewById(R.id.start_bar);
        jdtBar.setMax(5);//设置进度条的大小,将进度条分成5段
    }

    //新建一个内部类MyTask继承AsyncTask
    class MyTask extends AsyncTask<Integer,Integer,String>{

        //执行耗时操作
        @Override
        protected String doInBackground(Integer... integers) {
            for(int i = 1;i<=5;i++){  //做for循环
                try{
                    Thread.sleep(1000);//让子线程睡上1秒
                    publishProgress(i);//在子线程运行过程中,更新主线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "下载完成";//子线程运行结束后,返回结果
        }

        //子线程运行中调用此方法来更新主线程
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            jdtBar.setProgress(values[0]);//对主线程进行传值更新
        }

        //耗时操作执行后,调用此方法
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            startBtn.setText(s);//给Button赋值
            startBtn.setEnabled(true);//设置Button可点击
        }
    }
}

用Handler实现进度条界面

步骤

  1. 在xml中创建控件
  2. 在java创建控件对象
  3. 设Handler对象
  4. 绑定id
  5. 设置监听
public class Main2Activity extends AppCompatActivity {

    //创建控件对象
    private ProgressBar handlerBar;
    private Button handlerBtn;
    //设Handler对象
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            handlerBar.setProgress(msg.arg1);//给进度条赋值
            if(msg.arg1==5){     //给按钮赋值的条件
            handlerBtn.setText("下载完成");//给按钮赋值
        }
        }
    };



    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        bind();

              //设置进度条最大值,就是给进度条分段
       handlerBar.setMax(5);
        //添加按钮监听
     handlerBtn.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
             new Thread(new Runnable() {   //设置线程
                 @Override
                 public void run() {
                     for (int i = 1;i<=5;i++){  //for循环
                         try {
                             Thread.sleep(1000); //让子线程睡上1秒
                         } catch (InterruptedException e) {
                             e.printStackTrace();
                         }
                         Message message = handler.obtainMessage();//设置message对象赋值
                         message.arg1 = i;
                         message.what = 1;
                         handler.sendMessage(message);//给Handler发送值
                     }
                 }
             }).start();//启动线程
         }
     });


    }

    //绑定ID
    private void bind() {
        handlerBar = findViewById(R.id.handlerjdt_bar);
        handlerBtn = findViewById(R.id.handlerstart_btn);
    }



}

用AsyncTask实现倒计时界面

java代码

public class JingDuActivity extends AppCompatActivity {

    //创建控件对象
    private EditText sjEd;
    private Button dsBtn;
    private TextView djsTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jing_du);

        bindID();

        dsBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int time = Integer.parseInt(sjEd.getText().toString());//将字符串转换成整形
                new MyTask().execute(time);//启动任务
            }
        });

    }

    //绑定ID
    private void bindID() {

        sjEd = findViewById(R.id.sj_ed);
        dsBtn = findViewById(R.id.ds_btn);
        djsTv = findViewById(R.id.djs_btn);

    }

    //新建一个内部类MyTask继承AsyncTask
    class MyTask extends AsyncTask<Integer,Integer,String>{
        int j;
        @Override
        protected String doInBackground(Integer... integers) {

            for (int j = integers[0];j>=1;j--){
                try {
                    Thread.sleep(1000);
                    publishProgress(j);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "倒计时结束";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            djsTv.setText(values[0]+"");//更新UI
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            sjEd.setText(s);//返回结果
        }
    }

}

用Handler实现倒计时界面

java代码

public class Main2Activity extends AppCompatActivity {
    //创建控件对象
    private EditText shijianET;
    private TextView daoshuTV;
    private Button jishiBtn;
    private int time;

    //创建Handler对象
    private Handler handler= new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
                daoshuTV.setText(msg.what+""); //通过SetText方法将传过来的值放到TextView

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        bindID();

        jishiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                time = Integer.parseInt(shijianET.getText().toString());

                new Thread(new Runnable() {
                    @Override
                    public void run() {

                        for (int i =time;i>=0;i--){
                            Message message = handler.obtainMessage();
                            message.what = time;
                            handler.sendEmptyMessage(i);
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        });
    }

    private void bindID() {

        shijianET = findViewById(R.id.shijian_et);
        daoshuTV = findViewById(R.id.daoshu_tv);
        jishiBtn = findViewById(R.id.jishi_btn);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值