您的位置:首页 > 产品设计 > UI/UE

android post和get请求 && 子线程获取UI线程的值

2015-09-15 16:23 357 查看
重点:子线程获取UI值,但是不能修改。

在下面的例子中,子线程获取UI在UI线程中输入的用户名密码。

Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍常用的两种网络请求方式POST,GET。首先要区别POST和GET请求

1. GET是从服务器上获取数据,POST是向服务器传送数据。

2. GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。POST是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程

3. GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据

4. GET安全性非常低,POST安全性较高。但是执行效率却比POST方法好。

下面分别用Post和GET方法来实现Android应用的人员登入,首先我们搭建一个服务器,这里我使用WAMP环境,使用ThinkPHP框架。详细的服务器搭建就不说了。给出主要响应代码:

Php代码 :

<?php
namespace Home\Controller;
use Think\Controller;
class AndroidController extends Controller {
public function index()
{
//获取账号密码
$id=I('username');
$pwd=I('password');
$User=M('user');
//查询数据库
$data = $User->where("NAME='$id' AND PASSWORD='$pwd' ")->find();
//登入成功
if($data)
{
$response = array('success' => true,'msg'=>'登入成功');

$response=json_encode($response);
echo $response;//返回json格式
}
//登入失败
else
{
$response = array('success' => false,'msg'=>'账号或密码错误');
$response=json_encode($response);
echo $response;//返回json格式
}
}

}

记得添加网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Android的网络请求主要使用java.net包中的HttpURLConnection类,服务器与Android客户端数据交互格式为Json

1.利用POST请求方式来实现人员登入

package com.dream.apm;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

public class MyActivity extends Activity {

//请求地址
private static String url="http://10.0.2.2:8080/think/index.php/Home/Android";
public Button start;

public EditText username,password;

public URL http_url;

public String data;

public Handler handler;

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//去除应用程序标题
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.main);

start=(Button)findViewById(R.id.start_one);
username=(EditText)findViewById(R.id.username);
password=(EditText)findViewById(R.id.password);
//消息处理器

Handler默认是和主线程绑定的

handler=new Handler(Looper.getMainLooper())
{
@Override
public void handleMessage(Message msg) //主线程处理消息
{
super.handleMessage(msg);
switch(msg.what)
{
//登入成功
case 1:
Toast.makeText(MyActivity.this, msg.getData().getString("msg"),
Toast.LENGTH_SHORT).show();
break;
//登入失败
case 2:
Toast.makeText(MyActivity.this, msg.getData().getString("msg"),
Toast.LENGTH_SHORT).show();
break;

}
}
};

start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//是否输入账号密码

//子线程可以获取UI的值,不能更改

if(username.getText().toString().length()>0&&password.getText().toString().length()>0){

new Thread(new Runnable() {
@Override
public void run() {
try {
http_url=new URL(url);
if(http_url!=null)
{
//打开一个HttpURLConnection连接
HttpURLConnection conn = (HttpURLConnection) http_url.openConnection();
conn.setConnectTimeout(5* 1000);//设置连接超时
conn.setRequestMethod("POST");//以get方式发起请求
//允许输入输出流
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);//使用Post方式不能使用缓存
//获取账号密码
String params = "username=" + username.getText().toString()
+ "&password=" + password.getText().toString();
//设置请求体的类型是文本类型
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//设置请求体的长度--字节长度
conn.setRequestProperty("Content-Length",String.valueOf(params.getBytes().length) );
//发送post参数
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
bw.write(params);
bw.close();
//接收服务器响应
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();//得到网络返回的输入流
BufferedReader buf=new BufferedReader(new InputStreamReader(is));//转化为字符缓冲流
data=buf.readLine();
buf.close();is.close();
//判断登入结果
analyse(data);
}
}
} catch( Exception e) {
e.printStackTrace();
}
}
}).start();
}
else
{
Toast.makeText(MyActivity.this, "请完整输入账号密码",
Toast.LENGTH_SHORT).show();
}
}
});
}

public void analyse (String data)
{
System.out.println(data);
try {
JSONObject json_data=new JSONObject(data);
Boolean state=json_data.getBoolean("success");
String msg=json_data.getString("msg");
//登入成功
if(state)
{
//发送消息
Message message= new Message();
message.what=1;
Bundle temp = new Bundle();
temp.putString("msg",msg);
message.setData(temp);
handler.sendMessage(message);

}
//登入失败
else
{
Message message= new Message();
message.what=2;
Bundle temp = new Bundle();
temp.putString("msg",msg);
message.setData(temp);
handler.sendMessage(message);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: