Android通过PHP服务器实现登录

Android客户端和PHP、MySQL搭建的服务器之间的简单交互,实现登录功能 。

实现原理图:

Handler消息机制原理:

Handler机制主要包括4个关键对象,分别是Message、Handler、MessageQueue、Looper。

下面对这4个关键对象进行简单的介绍。

1.Message

Message是线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。Message的what字段可以用来携带一些整型数据,obj字段可以携带一个Object对象。

2.Handler

Handler就是处理者的意思,它主要用于发送消息和处理消息。一般使用Handler对象的sendMessage()方法发送消息,发出的消息经过一系列的辗转处理后,最终会传递到Handler对象的HandlerMessage()方法中。

3.MessageQueue

MessageQueue是消息队列的意思,它主要用来存放通过Handler发送的消息。通过Handler发送的消息会存在MessageQueue中等待处理。每个线程中只会有一个MessageQueue对象。

4.Looper

Looper是每个线程中的MessageQueue的管家。调用Looper的loop()方法后,就会进入一个无限循环中。然后,每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的HandlerMessage()方法中。此外,每个线程也只会有一个Looper对象。在主线程中创建Handler对象时,系统已经创建了Looper镀锌,所以不用手动创建Looper对象,而在子线程中的Handler对象,需要调用Looper.loop()方法开启消息循环。

图中可以清晰的看到整个Handler消息机制处理流程。Handler消息处理首先需要在UI线程创建一个Handler对象,然后在子线程中调用了sendMessage()方法,接着这个消息会存放在UI线程的MessageQueue中,通过Looper对象取出MessageQueue中的消息,最后分发回Handler的HandMessage()方法中。

下面是我写的代码以及本程序的logcat的运行结果。

本次任务中遇到的难题:

无法连接到PHP服务器。实现了把自己输入的用户名和密码封装成了JSON但是无法发送到PHP进行与数  据库的比对。

package com.itcast.test03;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    private EditText et_username;
    private EditText et_userPsd;
    private Button login;
    private Button signUp;
    private CheckBox save;
    private String user,pass;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_username = (EditText)findViewById(R.id.et_number);
        et_userPsd = (EditText)findViewById(R.id.et_password);
        login=(Button)findViewById(R.id.login);
        signUp=(Button)findViewById(R.id.signUp);
        save = (CheckBox)findViewById(R.id.save);
        //登录按钮的点击事件
        login.setOnClickListener(new View.OnClickListener() {

               @Override
               public void onClick(View v) {
                // TODO Auto-generated method stub

                 //将输入的用户名和密码转换成字符串
                String name =et_username.getText().toString();
                String pwd = et_userPsd.getText().toString();
                 //调用login方法
                login(name, pwd);
               }
              });
             }

             private void login(final String name, final String pwd){
                 //创建Handler对象
              final Handler handler = new Handler() {

               public void handleMessage(Message msg) {
                if(msg.what == 1){
                    Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                 //提示登陆成功
                 finish();
                }else if(msg.what == 0){
                 Log.i(name, msg.toString());
                }else if(msg.what == -1){
                 Log.i("==============",msg.toString());
                }
               }
              };
              new Thread(){
               public void run() {
                   //创建Message对象
                Message msg =new Message();
                try {
                 Post po = new Post();
                 String infoo = po.logina(name, pwd);
                             if(infoo != null){
                              msg.what = 1;//成功
                              msg.obj = infoo;
                             }else{
                              msg.what = 0;//失败
                              msg.obj = "2";
                             }
                         } catch (Exception e) {
                          e.printStackTrace();
                    msg.what = -1;
                    msg.obj = e;
                         }
                handler.sendMessage(msg);
               }
              }.start();
             }
    }
    
package com.itcast.test03;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class Post {

    public String logina(String name, String pwd)throws ParseException, IOException, JSONException{
         //获取到HttpClient对象
          HttpClient httpClient = new DefaultHttpClient();
          String strurl = "http://10.6.78.213:2016/xampp/sse/index.php/home/Index/server_info";
          HttpPost request = new HttpPost(strurl);
          request.addHeader("Accept","application/json");
          request.addHeader("Content-Type","application/json");//还可以自定义增加header
          JSONObject param = new JSONObject();//定义json对象
          param.put("sequenceId", "87620056570355357690");
          param.put("accType", "0");
          param.put("loginId", name);
          param.put("password", pwd);
          //param.put("thirdpartyAppId", "");
          //param.put("thirdpartyAccessToken", "");
          param.put("loginType", "1");
          Log.i("===========", param.toString());
          System.out.println("1+===========");
          StringEntity se = new StringEntity(param.toString());
          request.setEntity(se);//发送数据
          HttpResponse httpResponse = httpClient.execute(request);//获得相应
         System.out.println("2+===========");//进行一行一行的调试时无法打印此语句。原因就是无法成功连接到                           网络
          int code = httpResponse.getStatusLine().getStatusCode();
          System.out.print(code);
          String result = EntityUtils.toString(httpResponse.getEntity());
          JSONObject result1 = new JSONObject(result);
          String info = (String) result1.get("retInfo");
          Log.i("=============", info);
          return info;
         }

}

时间: 2024-08-02 11:04:46

Android通过PHP服务器实现登录的相关文章

android与javaee通信:登录界面超级简化版

今天完成了利用android和tomcat服务器完成了简单界面的通信. 主要就是用户输入id和密码,界面显示登录成功还是失败. 昨天完成代码后,尚未来得及调试,今天通过调试,发现了以下几点错误: 1.测试的时候忘了启动tomcat服务器(好吧这是一个很蠢的错误..) 2.客户端设置的编码格式中的"UTF-8"写成了"UTF_8"(好吧我知道这也很蠢...) 3.传送数据的时候服务端返回的数据和客户端接收数据的格式不一致,导致了乱码. 4.试图在新开的用于访问网络的线

android实现discuz论坛的登录

今天工作中遇到的一个问题,需求是这样的,需要给dz的论坛做一个android扩展,这肯定少不了会员登录,就得需要二次开发dz提供一个登录接口,眩晕中... 因为我对dz不熟悉,所以这个工作对我来说还是有难度的. 仔细分析了一下,在android上为什么需要客户端登录? 答案是肯定的,就是为了获取能唯一标识该用户的信息--uid,其实登录的目的就是这么单纯(提供接口不也是给客户端一个uid嘛). 那既然只是为了获取一个uid,我们应该还有其他的方式获取,首先就想到了用WEB登录的方式,因为dz已经

android开发实现微信三方登录

android开发实现微信三方登录 标签: 微信开放平台三方登录微信开放平台android开发HttpClient 2016-03-22 11:13 2077人阅读 评论(0) 收藏 举报  分类: android开发(26)  版权声明:本文为博主原创文章,未经博主允许不得转载. 需要了解的知识:OATH2的简单机制.http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html这篇文章写得很清晰(谢谢作者). 基本流程(从微信官方文档截图):(说的

利用xshell密钥管理服务器远程登录

1.生成公钥(Pubic Key)与私钥(Private Key): Xshell自带有用户密钥生成向导,如下图所示:点击菜单栏的工具->新建用户密钥生成向导 虽然SSH2协议中RSA和DSA算法都可以使用,但是为了保险起见,我们一般都选择RSA密钥类型,这样不论你使用的SSH协议是SSH1还是SSH2都可以使用;密钥长度1024位即 正在生成密钥,直接下一步即可 密钥名称可以随便填写,不过一般我们最好是默认名称_年月日,这样方便日后管理;一般不需要填写密钥密码,填写的话就是密钥加密码双重验证,

【Android】与服务器实现JSON数据通信

一.前言 作为一名移动端开发人员,具备一定的服务端开发能力也是非常必要的,本篇博客讲述如何在Android和服务器之间实现JSON数据通信交互,博客内容基于另外一篇博客:[Web]Eclipse + Maven + Struts搭建服务器. 二.服务器端改造 在博客[Web]Eclipse + Maven + Struts搭建服务器中,我们实现了服务器的搭建,现在要做的事情就是让它返回的数据是一个JSON格式的,这样在获得请求的时候,我们才可以得到JSON数据,其配置改变如下. 首先我们新建一个

Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台.传输数据格式标准.交互方便. 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API.而下面的几种方式就是从这两种协议扩展出来的:webservices soap.SSH的JSON(可参考:该链接

Android手机与服务器(案例一)

1.服务端 建立webservice,增加方法gettime和sum. 测试正常8080端口,关闭防火墙. Start启动服务,并且OpenBrowser,XE6真是方便啊 http://localhost:8080/wsdl/IsoapTest 保存wsdl文件. 2.客户端 android使用,只能建立firemonkey mobile Application. 放控件HTTPRIO1 写代码 HTTPRIO1.URL := 'http://127.0.0.1:8080/soap/Isoap

用脚本同步android项目至服务器最新版本

#!/bin/sh # ROOT_DIR=/backup/ PRJ_NAME=6592wetcust BRR_NAME=mydev cd $ROOT_DIR$PRJ_NAME"/" echo ">>>>>>>>.. repo clean ..<<<<<<<<<<<<<" repo forall -c git reset --hard repo

Android连接socket服务器上传下载多个文件

android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { int port = 8888;// 端口号,必须与客户端一致 // 选择进行传输的文件(测试) String path = "C:\\Temp"; String filePath = "E:\\img.png"; Socket client; public static void main(Strin