今天学习到Android的多线程部分,简单总结一下,并做了个简单的Demo:
在安卓应用程序中一些耗时的操作,比如读取数据,UI更新,网络数据传输等任务不能在主线程中进行,否则会造成UI阻塞,给用户带来不良的体验甚至5秒后还卡主就显示ANR错误;所以在程序中我们使用多线程来执行这些操作,在安卓中也叫信息传递 机制:
主要内容如下:
1、多线程的实现方式:Thread和实现Runnable接口;
2、创建Hander对象发送并处理信息
1.1线程的创建:
1:Thread thread = new Thread(new Runnable){
//重写run方法
public void run(){
//要执行的操作}
}
2:通过Runnable接口
public class ClassName extends Object inplements Runnable{
//重写run方法
public void run(){
//要执行的操作}}
------------------------------------------------------------------------------------------------------------------------------------------------------------
2:Hander的信息传递:
1、实例化Hander对象
2、执行发送信息:
3;重写信息处理handMessage();
在这个过程中注意Looper的使用
在实例化hander之前需要先准备Looper.prepare();最后需要启动Looper.loop();
3:以下是一个多线程配合ProcessBar自动填充的实例:
3.1:是布局文件,主要是添加一个ProcessBar的控件和一个发送多线程的按钮:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <ProgressBar style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal" android:id="@+id/process" android:max="100" android:progress="10" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="发送延时" android:id="@+id/send" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
3.2,以下是主要功能代码“:
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; public class Progress extends AppCompatActivity { private final int flag=1; private ProgressBar progressBar; private Button sennd; int amount = 0; private Handler handler= new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case flag: progressBar = (ProgressBar) findViewById(R.id.process); if (amount!=100){ handler.sendEmptyMessageDelayed(flag,1000); amount++; progressBar.setProgress(amount); }else { Toast.makeText(Progress.this, "下载完成", Toast.LENGTH_SHORT).show(); } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress); initView(); } private void initView() { progressBar = (ProgressBar) findViewById(R.id.process); sennd = (Button) findViewById(R.id.send); sennd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Thread thread = new Thread(new Runnable() { @Override public void run() { handler.sendEmptyMessage(flag); } }); thread.start(); }; }); } }代码总体比较简单;但是在实现进度条的自增需要注意Hander延时发送信息写在if方法里,而多线程中只需要发送指令信息,不需要延时;
最终效果如下: