Android 进度条怎么做?多线程处理(小白速成11)

进度条分为不断滚动的小圆圈,和长条状的进度条

长条状进度条的使用

<ProgressBar
        android:id="@+id/progressBar2"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="448dp"
        android:max="100"
        android:progress="47"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

我们按照上述代码,可以实现一个水平的进度条,我们也可以通过max参数来控制进度条的最大值,通过progress参数控制进度条的初始值。
同时我们也可以通过下面这条java语句控制进度条的增减,在我们获取进度条对象以后。

progressBar.incrementProgressBy(10);

参数为正数时进度条增加,参数为负数时进度条减少。

圈型进度条的小例子

我们实现一下点击按钮之后,过五秒钟进度条消失。
这里涉及到删除组件的情况,我们不能在主线程之外删除组件,但是如果不设置多线程,五秒钟会造成线程阻塞,导致程序意外退出。这里我们采取了view.post()方法来实现。

view.post()来实现组件的删除

   <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="116dp"
        app:layout_constraintBottom_toTopOf="@+id/progressBar2"
        app:layout_constraintEnd_toEndOf="@+id/progressBar2"
        app:layout_constraintStart_toStartOf="@+id/progressBar2"
        app:layout_constraintTop_toTopOf="parent" />


   <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="134dp"
        android:layout_marginRight="134dp"
        android:layout_marginBottom="63dp"
        android:text="Button"
        android:onClick="test"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
public void test(final View view){
     
        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                try {
     

                    Thread.sleep(5000);
                } catch (InterruptedException e) {
     
                    e.printStackTrace();
                }
                view.post(new Runnable() {
     
                    @Override
                    public void run() {
     

                        ViewGroup group = (ViewGroup) progressBar2.getParent();
                        group.removeView(progressBar2);
                    }
                });
            }
        }).start();
    }

当然我们也可以用handler消息队列处理器来达到同样的效果

Handler来实现组件的删除

我们将刚才新建的长条型的进度条删除

private  ProgressBar progressBar ;
    private  ProgressBar progressBar2 ;
    private Handler handler=new Handler();

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

        progressBar =findViewById(R.id.progressBar2);
        progressBar2 =findViewById(R.id.progressBar);

        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                try {
     
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
     
                    e.printStackTrace();
                }

                handler.post(new Runnable() {
     
                    @Override
                    public void run() {
     
                        //在这里更新ui组件
                        ViewGroup group = (ViewGroup) progressBar.getParent();
                        group.removeView(progressBar);

                        //显示一句话
                        TextView textView =new TextView(MainActivity.this);
                        textView.setText("handler删除组件");
                        group.addView(textView);
                    }
                });

            }
        }).start();
    }

我们还可以再进行扩展,运行程序时让进度条自增,然后到最后自动删除,并且提示信息!


        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                while (flag) {
     
                    try {
     
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
     
                        e.printStackTrace();
                    }

                    handler.post(new Runnable() {
     
                        @Override
                        public void run() {
     
                            //在这里更新ui组件
                            if (progressBar.getProgress() == progressBar.getMax()) {
     
                                ViewGroup group = (ViewGroup) progressBar.getParent();
                                if (group != null) {
     
                                    group.removeView(progressBar);


                                //显示一句话
                                TextView textView = new TextView(MainActivity.this);
                                textView.setText("handler删除组件");
                                group.addView(textView);
                                }
                                flag = false;
                            }
                            progressBar.incrementProgressBy(10);

                        }
                    });
                }

            }
        }).start();
    }

这样写代码显得难以读取,我们还可以应用handler中的Callback()方法,就能实现更新组件和其他操作分离,和上面的代码相比,更加有条理,也更加便于修改。

public class MainActivity extends AppCompatActivity {
     

    private ProgressBar progressBar2;
    private boolean flag = true;
    private Handler handler = new Handler(new Handler.Callback() {
     
        @Override
        public boolean handleMessage(@NonNull final Message msg) {
     
            //关于ui线程的代码放到这里
            final ProgressBar progressBar= (ProgressBar) msg.obj;
            handler.post(new Runnable() {
     
                @Override
                public void run() {
     
                    //在这里更新ui组件

                    if (progressBar.getProgress() == progressBar.getMax()) {
     
                        ViewGroup group = (ViewGroup) progressBar.getParent();
                        if (group != null) {
     
                            group.removeView(progressBar);


                            //显示一句话
                            TextView textView = new TextView(MainActivity.this);
                            textView.setText("handler删除组件");
                            group.addView(textView);
                        }
                        flag = false;
                    }
                    progressBar.incrementProgressBy(10);

                }
            });

            return false;
        }
    });

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

        final ProgressBar progressBar = findViewById(R.id.progressBar2);
        progressBar2 = findViewById(R.id.progressBar);

        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                while (flag) {
     
                    try {
     
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
     
                        e.printStackTrace();
                    }
                    Message msg= new Message();
                    msg.obj=progressBar;
                    handler.sendMessage(msg);


                }

            }
        }).start();
    }

    public void test(final View view) {
     
        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                try {
     

                    Thread.sleep(5000);
                } catch (InterruptedException e) {
     
                    e.printStackTrace();
                }
                view.post(new Runnable() {
     
                    @Override
                    public void run() {
     

                        ViewGroup group = (ViewGroup) progressBar2.getParent();
                        group.removeView(progressBar2);
                    }
                });
            }
        }).start();
    }

}

message就相当于是一个传输信息的载体,它里面预留了arg1、arg2等可以存放数字,obj可以存放我们要传递的对象。
例如我们将arg1赋值为1,并且表示下载成功,我们只需在读取时判断。
当我们想传输的对象比较多的时候,我们还可以定义Bundle对象

Bundle bundle =msg.getData();
bundle.putInt();//还有很多put方法可选择

这个bundle相当于一个map但是里面的key是String类型的。

以上就是进度条的制作方法,以及进度条后续的处理过程。

参考自:尚学堂课

你可能感兴趣的:(android,android,java,安卓,android,studio)