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
原创粉丝点击