[Android] ProgressDialog与耗时操作

ProgressDialog与耗时操作

今天来研究一下ProgressDialog与耗时操作,相信大家平时经常会看到在执行耗时操作时界面会有一个圆圈一直转,常见的比如网络请求时就经常会出现,虽然很简单,但是还是想亲自尝试一下!

这其中会涉及到单个知识点,一个是ProgressDialog的使用,一个是Handler的使用,还有一个就是线程的使用,具体ProgressDialog怎么使用,Handler的用法以及内部实现原理,大家可以去Google查找相关资料以加深理解。

代码分析

  • activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context="com.glemontree.progressdialogtest.MainActivity">
    
      <Button
          android:id="@+id/download"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="开始下载" />
    
    </LinearLayout>

    布局文件不要太简单。。就放置了一个Button,没什么好说的。。

  • MainActivity.class

    package com.glemontree.progressdialogtest;
    
    import android.app.ProgressDialog;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
      private Button mDownloadButton;
      private static final int SHOW = 1;
      private static final int HIDE = 0;
      private ProgressDialog mProgressDialog = null;
    
      private Handler handler = new Handler() {
          @Override
          public void handleMessage(Message msg) {
              switch (msg.what) {
                  case SHOW:
                      mProgressDialog = ProgressDialog.show(MainActivity.this, "test", "This is a test");
                      break;
                  case HIDE:
                      mProgressDialog.dismiss();
              }
          }
      };
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          mDownloadButton = (Button) findViewById(R.id.download);
          mDownloadButton.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  handler.sendEmptyMessage(SHOW);
                  new Thread() {
                      public void run() {
                          try {
                              Thread.sleep(3000);
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
                          handler.sendEmptyMessage(HIDE);
                      }
                  }.start();
              }
          });
      }
    }

    大家都知道更新UI只能在主线程中进行更新,因此如果将耗时操作放置在另外一个线程中完成,当耗时操作执行完成后若要更新UI,其实有两种方法:

    • runOnUiThread
    • Handler

    我这里使用的是Handler机制,主要是在主线程中建立Handler,在建立Handler的同时需要实现其handleMessage(Message msg)方法,该方法由用户实现,可以根据不同的msg实现不同的操作,在上面的程序中,主要是根据msg的内容实现ProgressDialog的显示和消失。

    在Button的点击事件中,首先通过Handler发送SHOW消息,然后消息到达handlerMessage(Message msg)方法中后由于是SHOW消息所以会显示ProgressDialog;然后会开启一个线程,在线程中睡眠3S用来模拟耗时操作的执行,当耗时操作执行完成后再发送HIDE消息,消息到达handlerMessage(Message msg)方法中后由于是HIDE消息所以ProgressDialog消息。这就是整个程序的功能!

后续工作

  • 研究一下Handler的实现机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值