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的实现机制