混合APP开发的套路(6): Android发送http网络请求
2017-04-21 13:59
459 查看
前面我们做来一个非常简单丑陋的界面,通过html页面打开一个登录窗口,这就是我们所谓的混合开发,部分功能使用原生代码来编写,另外一部分使用html编写。
今天我们要来学习
关于http网络请求,如果我们使用最原始的方式也能实现,但是实际开发我们肯定是使用一些现成的开源内库。
我这里使用的是:
https://github.com/afollestad/bridge
1、怎么集成到项目中
看Gradle:
https://github.com/afollestad/bridge#gradle-android
点击
下载完成可以在
2、使用该内库
来到登录页面,当用户输入”用户名”和”密码之后,点击”登录”按钮,发送网络请求。
业务逻辑是在
现在我们在这里发送网络请求:
点击“登录”按钮,启动一个子线程(
注意这部分代码,不仅有使用
其他知识:在子线程弹出对话框要注意的点
简单理解下:Android系统内部有相应的消息队列和消息循环机制
如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环
3、演示
至此这个
4、服务器端
http://192.168.15.138/user.php 代码:
今天我们要来学习
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));
相关文章推荐
- Android请求网络共通类——Hi_博客 Android App 开发笔记
- Android开发之http网络请求返回码问题集合。
- android开发 网络请求 java.lang.IllegaIArgumentException.baseUrl must end in /:http://fpush.sayimo.XXXX
- Android开发之http网络请求返回码问题集合。
- Android HttpUrlConnection 发送网络请求步骤总结
- Android开发之HTTP网络请求返回码
- 混合APP开发的套路(三): android和javascript初步交互
- Android开发之http网络请求返回码问题集合。
- Android开发全程记录(十六)——android调用接口发送http请求缓存处理
- Android的http网络请求和发送
- iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。
- Android应用开发网络请求 HttpClient和HttpURLConnection的区别
- 【Android网络开发】(一)HTTP请求报文和HTTP响应报文
- [置顶] Android开发之http网络请求返回码问题集合。
- Android开发 HTTP 发送 Post 与 Get 请求
- Android开发笔记-使用Volley开源库进行Http网络请求(POST方式)
- Android使用HttpURLConnection发送网络请求(笔记)
- kotlin 开发 android 程序中网络http请求和线程的使用
- Android实际开发之网络请求组件的封装(OkHttp为核心)
- Android 开发之异步网络请求(AsyncHttp开发)