当前位置:主页 > IT技术分享 >

android线程登录,android线程

作者:AG集&#发表时间:2019-02-01

android线程登录,android线程

主入口代码:

package com.tp.soft.app;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.tp.soft.http.HttpUtil;
import com.tp.soft.io.IOUtil;
import com.tp.soft.util.Constant;

public class MainActivity extends Activity implements OnClickListener{

    private EditText mUser,mPwd;
    private Button mSumbit;
    private ProgressDialog mProgressDialog;
    private String user;
    private String pwd;
    private Handler loginHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            boolean isNetErr = msg.getData().getBoolean("isNetErr");
            if(mProgressDialog != null){
                mProgressDialog.dismiss();
            }
            if(isNetErr){
                Toast.makeText(MainActivity.this, "当前网络不可用", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(MainActivity.this, "错误的用户名或者密码", Toast.LENGTH_SHORT).show();
            }
        }
        
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mUser = (EditText) findViewById(R.id.userEdit);
        mPwd = (EditText) findViewById(R.id.pwdEdit);
        
        mSumbit = (Button) findViewById(R.id.logBtn);
        mSumbit.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    
    @Override
    protected void onDestroy() {
        if(mProgressDialog != null){
            mProgressDialog.dismiss();
        }
        super.onDestroy();
    }

    @Override
    public void onClick(View v) {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("正在登录,请稍等...");
        mProgressDialog.show();  
        user = mUser.getText().toString();
        pwd = mPwd.getText().toString();
        if(validateInfo(user, pwd)){
            Thread loginThread = new Thread(new LoginHandler());
            loginThread.start();
        }
    
    }

    private boolean validateInfo(String user, String pwd) {
        if("".equals(user)){
            mProgressDialog.dismiss();
            Toast.makeText(MainActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();
            //setMsg("isEmptyUser");
            return false;
        }
        if("".equals(pwd)){
            mProgressDialog.dismiss();
            Toast.makeText(MainActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show();
            //setMsg("isEmptyPwd");
            return false;
        }
        return true;
    }

    private void setMsg(String msg, boolean isHas){
        Message message = new Message();
        Bundle bundle = new Bundle();
        bundle.putBoolean(msg, isHas);
        message.setData(bundle);
        loginHandler.sendMessage(message);
    }
    
    private void setInfo(JSONObject obj) {
        SharedPreferences sp = this.getSharedPreferences("userInfo", MODE_APPEND);
        Editor edit = sp.edit();
        try {
            edit.putString("LOGIN_NAME", obj.getString("login_name"));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        edit.commit();
    }
    
    /**
     * loginState 0(无网络) 1(帐号密码错误) 2(成功)
     * @param params
     * @param serverPath
     * @return
     */
    private int validateLogin(Map<String, String> params, String serverPath){
        int loginState = 0;
        HttpResponse response = HttpUtil.getHttpResonse(serverPath, params, Constant.ENCODING);
        if(null != response){
            if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                IOUtil ioUtil = new IOUtil();
                try {
                    String resultJson = ioUtil.getJson(response.getEntity().getContent());
                    JSONObject jsonObject = new JSONObject(resultJson);
                    boolean isSuccess = jsonObject.getBoolean("success");
                    if(isSuccess){
                        //Result r = JSONArray.parseObject(resultJson, Result.class);
                        //if(r.isSuccess()){
                            //setInfo(r);
                        //}
                        JSONObject userJson = jsonObject.getJSONObject("data").getJSONObject("user");
                        setInfo(userJson);
                        loginState = 2;
                    }else{
                        loginState = 1;
                    }
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }else{
                loginState = 0;
            }
        }
        return loginState;
    }
    
    class LoginHandler implements Runnable {

        @Override
        public void run() {
            String serverPath = Constant.LOGINURL;
            Map<String, String> params = new HashMap<String, String>();
            params.put("username", user);
            params.put("password", pwd);
            int status = validateLogin(params, serverPath);
            if(status == 0){
                setMsg("isNetErr", true);
            }else if(status == 1){
                setMsg("isNetErr", false);
            }else if(status == 2){
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, ShowActivity.class);
                startActivity(intent);
                finish();
            }
        }
        
    }
}

 

HttpClient封装:

package com.tp.soft.http;

import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.protocol.HTTP;

import android.util.Log;

/**
 * httpClient封装
 * @author taop
 *
 */
public class HttpUtil {
    public static HttpResponse getHttpResonse(String serverPath, Map<String, String> params, String encoding){
        List<NameValuePair> pairs = new ArrayList<NameValuePair>();
        if(null != params && !params.isEmpty()){
            for(Map.Entry<String, String> entry : params.entrySet()){
                pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
        }
        
        HttpResponse response = null;
        try{
            HttpPost post = new HttpPost(serverPath);
            post.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));
            response = getHttpClient().execute(post);
        }catch (ConnectTimeoutException e) {
            Log.e("提示", "连接超时");
            return null;
        } catch (SocketTimeoutException e) {
            Log.e("提示", "Socket连接超时");
            return null;
        } catch (Exception e) {
            Log.e("提示", e.getLocalizedMessage());
            return null;
        }
        
        return response;
    }
    
    public static HttpClient getHttpClient() {
        BasicHttpParams httpParams = new BasicHttpParams();
        ConnManagerParams.setTimeout(httpParams, 1000);
        /* 连接超时 */
        HttpConnectionParams.setConnectionTimeout(httpParams, 3000);// 设置请求超时3秒钟
        /* 请求超时 */
        HttpConnectionParams.setSoTimeout(httpParams, 3000);// 设置等待数据超时时间3秒钟
        HttpClient client = new DefaultHttpClient(httpParams);
        return client;
    }
}

IO封装:

package com.tp.soft.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class IOUtil {
    public String getJson(InputStream is){
        String jsonData = "";
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String resData = "";
        try {
            while((resData=br.readLine())!=null){
                jsonData += resData;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                br.close();
                isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return jsonData;
    }
}

Constant类:

package com.tp.soft.util;

public class Constant {
    public final static String ENCODING = "UTF-8";
    public final static String SERVER_PATH = "http://xxx.xxx.xxx.xxx:8081/wsTest1/ws/rest/";
    public final static String LOGIN_METHOD = "login";
    public final static String LOGINURL = SERVER_PATH + "loginService/" + LOGIN_METHOD;
}

服务器用的是rest版的webservice

代码:

package com.tp.soft.web.ws.impl;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.apache.log4j.Logger;
import org.springframework.dao.DataAccessException;

import com.tp.soft.web.common.entity.Result;
import com.tp.soft.web.common.exception.BaseServiceException;
import com.tp.soft.web.common.util.Constant;
import com.tp.soft.web.dao.LoginDao;
import com.tp.soft.web.entity.po.AuUser;
import com.tp.soft.web.entity.vo.AuUserVo;
import com.tp.soft.web.ws.LoginService;

@Path("/loginService")
public class LoginServiceImpl implements LoginService{

    private static final Logger LOG = Logger.getLogger(LoginServiceImpl.class);

    @Resource(name="loginDao")
    private LoginDao loginDao;
    
    @POST
    @Path(value="/login")
    @Produces(MediaType.APPLICATION_JSON)
    public Result doLogin(@FormParam(value="username") String username, @FormParam(value="password") String password) {
        Result result = new Result();
        AuUserVo auUserVo = new AuUserVo();
        auUserVo.setLogin_name(username);
        AuUser auUser;
        try{
            auUser = loginDao.findUser(auUserVo);
        }catch (DataAccessException e) {
            LOG.error("【ibatis】登录异常", e);
            throw new BaseServiceException(e.getLocalizedMessage());
        }
        
        if(null == auUser){
            result.setErrMsg(Constant.LOGIN_NAME_ERROR);
        }else if(!password.equals(auUser.getLogin_pwd())){
            result.setErrMsg(Constant.LOGIN_PWD_ERROR);
        }else{
            result.setSuccess(true);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("user", auUser);
            result.setData(map);
        }
        
        return result;
    }

}

dao里面就是ibatis调用数据库 这边就不贴了


Android里有什方法启动线程

其实Android启动线程和JAVA一样有两种方式,一种是直接Thread类的start方法,也就是一般写一个自己的类来继承Thread类。另外一种方式其实和这个差不多啊! 那就是Runnable接口,然后把Runnable的子类对象传递给Thread类再创建Thread对象.总之都是需要创建Thread对象,然后调用Thread类的start方法启动线程。区别就是,一个是直接创建Thread对象,另外一个是需要implement了Runnable接口对象作为创建Thread对象的参数。Runnable其实我们称为线程任务。
第一种方式一般是这样用:
Class MyThread extends Thread{
public void run(){
//你要实现的代码
}
}
在主线程中启动这个线程:
public class Test{
public static void main(String[] args){
new MyThread().start();//启动了我们的线程了
}
}
2,第二种方式一般是这样用:
public class MyRunnable implements Runnable{
public void run(){
//你需要实现的代码
}
}
在主线程中启动这个线程:
public class Test{
public static void main(String[] args){
Thread t=new Thread(new MyRunnable());//这里比第一种创建线程对象多了个任务对象
t.start();
}
}
这里我想说的是可能你问这个问题是接触到了Android中的Handler概念:
其实Handler并不是开辟新线程的概念,Android主要的考虑到更新界面的问题,一般情况下,更新界面(Activity)都是在主线程中更新的,这样就遇到了一个问题,比方说:在下载文件时候我们需要进度条显示下载进度,界面需要更新(数据是不断变的,也就是下载的大小是不断变的,要是直接在主线程中更新,就会造成程序的堵塞,程序很容易崩溃,通常这样联网耗时的工作需要开辟另外一个线程的,这样就不会影响主程序了),好了,到这里联网操作一般都需要开辟新线程了吧。。
接下来就来说Handler了,刚刚我说了Handler不是开辟新线程,在我看来,Handler更像是主线程的秘书,是一个触发器,负责管理从子线程中得到更新的数据,然后在主线程中更新界面。简单说下进度条的那个:
下载了多少的数据都是在子线程中得到的,在子线程中通过Handler的sendMessage()方法发送得到的下载的数据,当你调用了sendMessage方法后,Handler就会回调(也就是自动调用)Handler中的 HandlerMessage方法。
我很认真写了,希望分给我! 要是还有不懂的,可以追问,总之Handler不是开辟线程,开辟线程的方式就和JAVA一样的! 千万不要被Android中的Handler混淆。
 
android线程与hander问题

getHtmlDate(1);使用这个方法,传给一个值1
但从你贴的getHtmlDate函数来看,这个1值(就是arg0这个形参)根本在函数中没有被使用到。

getHtmlDate,就是开个线程,往某个URL发个post请求,请求成功就向主线程的handler发个what=0的message,异常就发what=1的message。

从上面代码看,getHtmlDate要不要参数无所谓。
 

http://www.bkjia.com/Androidjc/872732.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/872732.htmlTechArticleandroid线程登录,android线程 主入口代码: package com.tp.soft.app;import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.apache.http.HttpR...

本文源自: 环亚娱乐

IT技术分享
联系我们