Handler实现多线程

一、什么是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;

@Override
protected 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主线程只负责界面更新 如果网络请求写在主线程里会抛异常。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页