Android通過PHP服務(wù)器實(shí)現(xiàn)登錄功能
Android客戶端和PHP、MySQL搭建的服務(wù)器之間的簡單交互,實(shí)現(xiàn)登錄功能 。
實(shí)現(xiàn)原理圖:

Handler消息機(jī)制原理:
Handler機(jī)制主要包括4個(gè)關(guān)鍵對象,分別是Message、Handler、MessageQueue、Looper。
下面對這4個(gè)關(guān)鍵對象進(jìn)行簡單的介紹。
1.Message
Message是線程之間傳遞的消息,它可以在內(nèi)部攜帶少量的信息,用于在不同線程之間交換數(shù)據(jù)。Message的what字段可以用來攜帶一些整型數(shù)據(jù),obj字段可以攜帶一個(gè)Object對象。
2.Handler
Handler就是處理者的意思,它主要用于發(fā)送消息和處理消息。一般使用Handler對象的sendMessage()方法發(fā)送消息,發(fā)出的消息經(jīng)過一系列的輾轉(zhuǎn)處理后,最終會(huì)傳遞到Handler對象的HandlerMessage()方法中。
3.MessageQueue
MessageQueue是消息隊(duì)列的意思,它主要用來存放通過Handler發(fā)送的消息。通過Handler發(fā)送的消息會(huì)存在MessageQueue中等待處理。每個(gè)線程中只會(huì)有一個(gè)MessageQueue對象。
4.Looper
Looper是每個(gè)線程中的MessageQueue的管家。調(diào)用Looper的loop()方法后,就會(huì)進(jìn)入一個(gè)無限循環(huán)中。然后,每當(dāng)發(fā)現(xiàn)MessageQueue中存在一條消息,就會(huì)將它取出,并傳遞到Handler的HandlerMessage()方法中。此外,每個(gè)線程也只會(huì)有一個(gè)Looper對象。在主線程中創(chuàng)建Handler對象時(shí),系統(tǒng)已經(jīng)創(chuàng)建了Looper鍍鋅,所以不用手動(dòng)創(chuàng)建Looper對象,而在子線程中的Handler對象,需要調(diào)用Looper.loop()方法開啟消息循環(huán)。

圖中可以清晰的看到整個(gè)Handler消息機(jī)制處理流程。Handler消息處理首先需要在UI線程創(chuàng)建一個(gè)Handler對象,然后在子線程中調(diào)用了sendMessage()方法,接著這個(gè)消息會(huì)存放在UI線程的MessageQueue中,通過Looper對象取出MessageQueue中的消息,最后分發(fā)回Handler的HandMessage()方法中。
下面是我寫的代碼以及本程序的logcat的運(yùn)行結(jié)果。
本次任務(wù)中遇到的難題:
無法連接到PHP服務(wù)器。實(shí)現(xiàn)了把自己輸入的用戶名和密碼封裝成了JSON但是無法發(fā)送到PHP進(jìn)行與數(shù) 據(jù)庫的比對。
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);
//登錄按鈕的點(diǎn)擊事件
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//將輸入的用戶名和密碼轉(zhuǎn)換成字符串
String name =et_username.getText().toString();
String pwd = et_userPsd.getText().toString();
//調(diào)用login方法
login(name, pwd);
}
});
}
private void login(final String name, final String pwd){
//創(chuàng)建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() {
//創(chuàng)建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);//發(fā)送數(shù)據(jù)
HttpResponse httpResponse = httpClient.execute(request);//獲得相應(yīng)
System.out.println("2+===========");//進(jìn)行一行一行的調(diào)試時(shí)無法打印此語句。原因就是無法成功連接到 網(wǎng)絡(luò)
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;
}
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android App端與PHP Web端的簡單數(shù)據(jù)交互實(shí)現(xiàn)示例
- Android md5加密與php md5加密一致詳解
- Android上傳文件到Web服務(wù)器 PHP接收文件
- PHP簡單判斷iPhone、iPad、Android及PC設(shè)備的方法
- php、java、android、ios通用的3des方法(推薦)
- 基于PHP后臺(tái)的Android新聞瀏覽客戶端
- php生成Android客戶端掃描可登錄的二維碼
- Android異步上傳圖片到PHP服務(wù)器
- 使用PHP開發(fā)Android應(yīng)用程序技術(shù)介紹
- Android訪問php取回json數(shù)據(jù)實(shí)例
- android+json+php+mysql實(shí)現(xiàn)用戶反饋功能方法解析
- Android和PHP MYSQL交互開發(fā)實(shí)例
相關(guān)文章
Android動(dòng)畫效果之自定義ViewGroup添加布局動(dòng)畫(五)
這篇文章主要介紹了Android動(dòng)畫效果之自定義ViewGroup添加布局動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Android編程之短信竊聽器實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程之短信竊聽器實(shí)現(xiàn)方法,以實(shí)例形式較為詳細(xì)的分析了Android編程實(shí)現(xiàn)竊聽器的具體步驟與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
Android實(shí)現(xiàn)注冊登錄界面的實(shí)例代碼
這篇文章主要介紹了Android實(shí)現(xiàn)注冊登錄界面的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
Android編程實(shí)現(xiàn)仿易信精美彈出框效果【附demo源碼下載】
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿易信精美彈出框效果,涉及Android窗口及動(dòng)畫操作相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-01-01
Android中Splash應(yīng)用啟動(dòng)白屏問題的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中Splash應(yīng)用啟動(dòng)白屏問題的兩種解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02

