Handler实现多线程
来源:互联网 发布:java生成mysql临时表 编辑:程序博客网 时间:2024/04/29 19:45
一、什么是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主线程只负责界面更新 如果网络请求写在主线程里会抛异常。
0 0
- 使用Handler实现多线程
- Handler实现多线程
- Android使用Handler实现多线程
- 多线程通讯之Handler实现
- 【Android技术整理】Handler以及Handler如何实现多线程
- android学习之Handler实现异步与多线程
- Android多线程——Handler (一) 实现图片下载
- Android多线程分析之三:Handler,Looper的实现
- Android多线程分析之三:Handler,Looper的实现
- android looper handler 多线程
- android handler 多线程demo
- android handler 多线程
- Handler与Android多线程
- android handler 多线程demo
- android handler 多线程demo
- Handler的多线程处理
- Android--多线程之Handler
- Android 多线程通信Handler
- Intent 实现活动之间的跳转
- 【大数据与云计算】大数据多维分析引擎在魅族公司的实践
- android sdk Manger 工具介绍
- oracle RAC数据库启停
- Android之Service
- Handler实现多线程
- 用 Node.js 和 AWS Lambda 创建无服务器的微服务
- Linux下驱动程序的操作(杂)
- Android之Messenger
- phpExcel应用
- MySQL快速复制数据库的方法
- VS2013键盘输入无效,重启无法恢复?
- ssm框架中获取request和response
- 【BZOJ 2190】[SDOI2008]仪仗队