Handler实现多线程
16lz
2021-01-24
一、什么是Handler
Handler 是 Android 给我们提供来更新 UI 的一套机制,也是一套消息处理的机制,我们可以发送消息,也可以通过它 来处理消息,Handler 在我们的 framework 中是非常常见的。
Android 在设计的时候,就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制就没有办法更新 UI 信息,就会抛出异常信息。
二、为什么要使用Handler
在android开发中我们需要用到一些耗时操作,比如网络连接,加载图片等。如果把这些操作都放在UI主线程中就会造成多线程阻塞情况 抛出异常信息。
三、下面是一些如何使用Handler机制实现多线程的代码片段
package com.Platforms.enterprise_Service;import android.annotation.SuppressLint;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.Button;import android.widget.Toast;import com.Platforms.enterprise_Service.Control.Login;import com.daimajia.androidanimations.library.Techniques;import com.daimajia.androidanimations.library.YoYo;import com.rengwuxian.materialedittext.MaterialEditText;public class Main_Login extends Activity {private MaterialEditText stuCodeEditText; private MaterialEditText pwdEditText; private Button btnlogin; private String username;private String password;@Overrideprotected void onCreate(Bundle savedInstanceState) { this.requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.ac_login); init(); btnlogin.setOnClickListener(stuLoginClick);}/** * 初始化 */private void init() { // TODO Auto-generated method stub stuCodeEditText=(MaterialEditText)findViewById(R.id.stuCodeEditText); pwdEditText=(MaterialEditText)findViewById(R.id.pwdEditText); btnlogin=(Button)findViewById(R.id.btnlogin);}/** * * @author Administrator *学生登录 *企业登录 */private OnClickListener stuLoginClick=new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if(identify=="0") { if(stuCodeEditText.getText().toString()==null){ YoYo.with(Techniques.Shake).playOn(stuCodeEditText); stuCodeEditText.setError("学号不能为空"); } else{ showLoadingView(); username=stuCodeEditText.getText().toString().trim(); password=pwdEditText.getText().toString().trim(); stuCodeEditText.setHint("请输入用户名"); HandlerThread ht=new HandlerThread("ht"); ht.start(); LoginThread lt=new LoginThread(ht.getLooper()); Message msg=lt.obtainMessage(); msg.arg1=1; msg.sendToTarget(); } } else { username=stuCodeEditText.getText().toString().trim(); password=pwdEditText.getText().toString().trim(); HandlerThread ht=new HandlerThread("ht"); ht.start(); EnterThread lt=new EnterThread(ht.getLooper()); Message msg=lt.obtainMessage(); msg.arg1=2; msg.sendToTarget(); } }};//显示进度条public void showLoadingView() { loadingLayout.setVisibility(View.VISIBLE);}//隐藏进度条public void hideLoadingView() { loadingLayout.setVisibility(View.GONE);}//主线程 @SuppressLint("HandlerLeak")public Handler MianThread=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.arg1==-1) { hideLoadingView(); Toast.makeText(Main_Login.this, "操作失败,稍后再试!",Toast.LENGTH_SHORT).show(); } if(msg.arg1==2) { hideLoadingView(); Toast.makeText(Main_Login.this, "登录成功!",Toast.LENGTH_SHORT).show(); } if(msg.arg1==3) { hideLoadingView(); Toast.makeText(Main_Login.this, "登录失败!",Toast.LENGTH_SHORT).show(); } } }; //学生登录线程 public class LoginThread extends Handler { public LoginThread(Looper looper) { super(); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); if(msg.arg1==1) { try { showLoadingView() ; username=stuCodeEditText.getText().toString().trim(); password=pwdEditText.getText().toString().trim(); Login login=new Login(); int result=login.login(0, "XXXXX", username,MD5Util(password)); Thread.sleep(5000); Message mainMsg = MianThread.obtainMessage(); mainMsg.arg1 = result; mainMsg.sendToTarget(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //企业登录线程 public class EnterThread extends Handler { public EnterThread(Looper looper) { super(); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); if(msg.arg1==2) { try { showLoadingView() ; username=stuCodeEditText.getText().toString().trim(); password=pwdEditText.getText().toString().trim(); Login login=new Login(); int result=login.login(1, null, username, password); Thread.sleep(5000); Message mainMsg = MianThread.obtainMessage(); mainMsg.arg1 = result; mainMsg.sendToTarget(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}
上面的代码开了 EnterThread和 LoginThread两个线程分别实现了企业身份和学生身份的登录。在它们自身的线程里实现了网络请求的操作, 然后把结果返回给主线程 MianThread, 主线程再做一些关于界面的操作。
注意:关于网络请求的操作一定要在子线程里面进行,UI主线程只负责界面更新 如果网络请求写在主线程里会抛异常。
更多相关文章
- Android(安卓):动画的使用(1)
- Android(安卓)开关机动画显示源码分析
- 简单理解Binder机制的原理
- Android(安卓)Framework系列之IPC(一)
- Android绘图机制(四)自定义控件
- 程序员挑战高薪,你必须会的十大面试题《一》
- android 笔记 --- Android中Handler,Looper,HandlerThread
- android-async-http开源请求库
- 【总结】Android消息机制