混合APP开发的套路(6): Android发送http网络请求
来源:互联网 发布:亚马逊网页是java吗 编辑:程序博客网 时间:2024/05/01 21:11
前面我们做来一个非常简单丑陋的界面,通过html页面打开一个登录窗口,这就是我们所谓的混合开发,部分功能使用原生代码来编写,另外一部分使用html编写。
今天我们要来学习Android发送http网络请求
。
关于http网络请求,如果我们使用最原始的方式也能实现,但是实际开发我们肯定是使用一些现成的开源内库。
我这里使用的是:
https://github.com/afollestad/bridge
1、怎么集成到项目中
看Gradle:
https://github.com/afollestad/bridge#gradle-android
点击Sync Now
开始下载。
下载完成可以在External Libraies
查看:
2、使用该内库
来到登录页面,当用户输入”用户名”和”密码之后,点击”登录”按钮,发送网络请求。
业务逻辑是在LoginActivity.java
中处理的,我们前面学习过”把用户登录信息(用户名和密码)保存到SharePreferences
中”:
login_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 保存到SharePreferences SharedPreferences sharedPreferences = getSharedPreferences("users",MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("user_login_name",login_username.getText().toString()); editor.commit(); // 上面完成用户登录信息的保存 // 下面跳转 Intent intent = new Intent(); intent.setClass(LoginActivity.this,WebViewActivity.class); startActivity(intent); } });
现在我们在这里发送网络请求:
// 给按钮组件绑定事件 login_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 启动一个子线程 new Thread(requestAPI).start(); } });
点击“登录”按钮,启动一个子线程(requestAPI
方法),这个子线程完成了http请求多业务代码。
/** * 发送网络请求不能在主线程,需要新开一个线程 */ Runnable requestAPI = new Runnable() { @Override public void run() { Form form = new Form().add("user_name",login_username.getText().toString()) .add("user_pass",login_pwd.getText().toString()); try { Request request = Bridge.post("http://192.168.15.138/user.php").body(form).request(); Response response = request.response(); if (response.isSuccess()){ // 服务器响应的数据转json JSONObject jsonObject = response.asJsonObject(); Looper.prepare(); //创建消息队列 // 对话框 AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this); builder.setTitle("登录结果"); builder.setMessage(jsonObject.get("message").toString()); builder.setPositiveButton("知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); // 关闭对话框 } }); builder.show(); // 不要忘记最后展示对话框 Looper.loop(); //进入消息循环 }else{ // http请求失败 } } catch (BridgeException e) { e.printStackTrace(); }catch (JSONException e) { e.printStackTrace(); } } };
注意这部分代码,不仅有使用Bridge
这个第三方的http内库,还有Android系统自带的对话框代码AlertDialog
。
其他知识:在子线程弹出对话框要注意的点
简单理解下:Android系统内部有相应的消息队列和消息循环机制
如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环
3、演示
至此这个LoginActivity.java(登录界面)
全部代码如下:
package com.example.dev.firtapp;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Looper;import android.support.annotation.Nullable;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import com.afollestad.bridge.Bridge;import com.afollestad.bridge.BridgeException;import com.afollestad.bridge.Form;import com.afollestad.bridge.Request;import com.afollestad.bridge.Response;import org.json.JSONException;import org.json.JSONObject;import static android.content.SharedPreferences.*;public class LoginActivity extends AppCompatActivity { Button login_btn; EditText login_username; EditText login_pwd; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置布局 this.setContentView(R.layout.login); // 拿到相关组件 login_btn = (Button)findViewById(R.id.login_btn); login_username = (EditText)findViewById(R.id.login_username); login_pwd = (EditText)findViewById(R.id.login_pwd); // 给按钮组件绑定事件 login_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 启动一个子线程 new Thread(requestAPI).start(); } }); } /** * 发送网络请求不能在主线程,需要新开一个线程 */ Runnable requestAPI = new Runnable() { @Override public void run() { Form form = new Form().add("user_name",login_username.getText().toString()) .add("user_pass",login_pwd.getText().toString()); try { Request request = Bridge.post("http://192.168.15.138/user.php").body(form).request(); Response response = request.response(); if (response.isSuccess()){ // 服务器响应的数据转json JSONObject jsonObject = response.asJsonObject(); Looper.prepare(); //创建消息队列 // 对话框 AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this); builder.setTitle("登录结果"); builder.setMessage(jsonObject.get("message").toString()); builder.setPositiveButton("知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); // 关闭对话框 } }); builder.show(); // 不要忘记最后展示对话框 Looper.loop(); //进入消息循环 }else{ // http请求失败 } } catch (BridgeException e) { e.printStackTrace(); }catch (JSONException e) { e.printStackTrace(); } } };}
4、服务器端
http://192.168.15.138/user.php 代码:
<?php$result = new stdClass();$result->message = "error username or password";$result->status = "error";if(isset($_POST["user_name"]) && isset($_POST["user_pass"])){ $get_uname = trim($_POST["user_name"]); $get_pwd = trim($_POST["user_pass"]); if($get_uname=="zhangsan" && $get_pwd=="123"){ $result->message = "login success"; $result->status = "success"; }}header("Content-type:application/json");die(json_encode($result));
- 混合APP开发的套路(6): Android发送http网络请求
- Android的http网络请求和发送
- 混合APP开发的套路(三): android和javascript初步交互
- 混合APP开发的套路(三): android和javascript初步交互(js调安卓)
- Android网络:发送http请求
- 混合APP开发的套路(二):加载项目中的html
- 混合APP开发的套路(五): Activity保存登录用户名
- Android app 开发套路
- iOS网络开发基础--发送HTTP请求
- 发送HTTP网络请求的方法
- 混合APP开发的套路(四):在html页面中打开项目中的Activity
- Android App混合开发
- android发送http请求
- android 发送http请求
- android 发送一个http请求的问题
- Android网络编程之http发送/请求服务
- android开发的http请求
- 混合APP开发的套路(四):在html页面中打开项目中的Activity(url的方式)
- web.xml
- ubuntu useradd 创建用户为三无用户
- LTspice introduction
- 常见数据挖掘算法和Python简单实现
- 浅谈MySQL中优化sql语句查询常用的30种方法
- 混合APP开发的套路(6): Android发送http网络请求
- JSON数据格式转化
- APP安全报告第十期:部分美图类APP存在窃取用户隐私数据的风险!
- linux中断由硬件到内核的路由
- makefile 函数调用理解与自定义函数
- Ajax+SSM实现四级联下拉列表
- mysql数学函数存储过程 Result consisted of more than one row
- Android release 签名大包出错
- 查找指定进程