前两天学习了datepicker日历,time picker时间以及chronrmeter计时器的基础控件,今天浅浅了解一下Android其中的一个高级UI组件progressbar吧,进度条基本是每一个App的必备了,它不仅能实时展示你的网速加载进度,同时还能增加用户的赏识性,极大程度的提升了软件的的友好性能,那么今天我们就来简单了解一下吧!
我就针对我要展示的代码来讲,我下面贴的代码是实现一个进度条,我会随机生成一个0-10的自然数,当前实时的进度就是累加起来的和,休眠时间为200毫秒,如200毫秒生成数值8则进度条为8%,如下一个200毫秒有生成一个数值9则此时的进度条达到(8%+9%)即17%当总数和达到100时也即完成进度条,toast出加载完成,进入下一个界面!
在代码段中已经进行了大量注释,如果有不明白的可以评论区留言或者私信我,如果有什么内容上的不足和错误还请各位同仁指正!
很明显完成这么一个功能用到了handler线程方面的知识,我就简单说一下吧,后期会出一期关于handler线程出处理机制的内容
(注意我下面介绍的量是我自己定义的,不要理解为一定要用currentprogress等)
简单介绍:
简单handler可以理解为主线程,thread可以简单理解为子线程,Android不能再主线程完成耗时操作所以要在子线程里完成耗时操作,然后调用主线程的handler对象用sendmessage方法将信息发送给主线程,主线程根据获得到的消息更新UI组件信息!其中的在子线程用到的currentprogress.what=0然后在主线程msg.what==0其实有一点点类似startactivityforresult的形式!
代码如下:
public class MainActivity extends AppCompatActivity { private ProgressBar progressBar; private Handler handler; private int currentprogerss=0; ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? progressBar=findViewById(R.id.progressbar); ?handler=new Handler(){ ? ? ?@Override ? ? ?public void handleMessage(@NonNull Message msg) { ? ? ? ?if(msg.what==0){ ? ? ? ? ?progressBar.setProgress(currentprogerss); ? ? ? ?}else { ? ? ? ? ? ?Toast.makeText(MainActivity.this,"加载完成",Toast.LENGTH_SHORT).show(); ? ? ? ? ? ?progressBar.setVisibility(View.GONE); Intent intent=new Intent(MainActivity.this,Main2Activity.class); startActivity(intent); ? ? ? ?} ? ? ?} ?}; ?new Thread(new Runnable() { ? ? ?@Override ? ? ?public void run() { ? ? ? ? while (true){ ? ? ? ? ? ? currentprogerss=work(); ? ? ? ? ? ? Message message=new Message(); ? ? ? ? ? ? if(currentprogerss<100){ ? ? ? ? ? ? ? ? message.what=0; ? ? ? ? ? ? ? ? handler.sendMessage(message); ? ? ? ? ? ? }else { ? ? ? ? ? ? ? ? message.what=1; ? ? ? ? ? ? ? ? handler.sendMessage(message); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? } ? ? ?} ? ? //模拟耗时操作 ? ? ?private int work() { ? ? ? ? ?currentprogerss+=Math.random()*10; ? ? ? ? ?try { ? ? ? ? ? ? ?Thread.sleep(200); ? ? ? ? ?} catch (InterruptedException e) { ? ? ? ? ? ? ?e.printStackTrace(); ? ? ? ? ?} ? ? ? ? ?return currentprogerss; ? ? ?}
?}).start(); ? ? }
} ?
?
|