Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)

1.前面提到Http的get/post方式  、 HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的

2.Android应用会经常使用http协议进行传输,网上会有很完善开源框架,已经包装好了http的get/post,还有httpclient等等;这样我们开发周期也会缩短;

3.下面通过一个Android案例来进行,说明常用的Http框架:

 在http://github.com/中搜索async http:

这里发现明显第1个android-async-http更多用户使用,这里的loopj/android-async-http是比较常用的http框架

4.使用开源框架get方式提交数据:

我们还是在之前的get的QQ登录案例进行讲解,我们将下载之后的loopj/android-async-http的源码代码文件复制到如下的工程中,效果如下:

loopj/android-async-http的源码代码文件路径是:\android-async-http-master\android-async-http-master\library\src\main\java

同时这里我已经不在需要之前的StreamTools工具类,因为这里的开源框架内部已经全部实现好了,接下来我们只需要修改MainActivity内部的代码如下:

  1 package com.itheima.qqlogin;
  2
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileOutputStream;
  7 import java.io.InputStream;
  8 import java.io.InputStreamReader;
  9 import java.net.HttpURLConnection;
 10 import java.net.MalformedURLException;
 11 import java.net.URL;
 12 import java.net.URLEncoder;
 13
 14 import org.apache.http.Header;
 15
 16 import com.loopj.android.http.AsyncHttpClient;
 17 import com.loopj.android.http.AsyncHttpResponseHandler;
 18
 19 import android.app.Activity;
 20 import android.os.Bundle;
 21 import android.text.TextUtils;
 22 import android.util.Log;
 23 import android.view.View;
 24 import android.widget.CheckBox;
 25 import android.widget.EditText;
 26 import android.widget.Toast;
 27
 28 public class MainActivity extends Activity {
 29     private static final String Tag = "MainActivity";
 30     private EditText et_qq;
 31     private EditText et_pwd;
 32     private CheckBox cb_remember;
 33
 34     @Override
 35     protected void onCreate(Bundle savedInstanceState) {
 36         super.onCreate(savedInstanceState);
 37         setContentView(R.layout.activity_main);
 38         //查询关心的控件
 39         et_qq = (EditText) findViewById(R.id.et_qq);
 40         et_pwd = (EditText) findViewById(R.id.et_pwd);
 41         cb_remember = (CheckBox) findViewById(R.id.cb_remember);
 42         Log.i(Tag,"oncreate 被调用");
 43         //完成数据的回显。
 44         readSavedData();
 45     }
 46     //读取保存的数据
 47     private void readSavedData() {
 48         // getFilesDir() == /data/data/包名/files/  获取文件的路径 一般系统是不会清理的。 用户手工清理,系统会有提示。
 49         // getCacheDir()==  /data/data/包名/cache/ 缓存文件的路径 当系统内存严重不足的时候 系统会自动的清除缓存 用户手工清理系统没有提示
 50         File file = new File(getFilesDir(),"info.txt");
 51         if(file.exists()&&file.length()>0){
 52             try {
 53                 //FileInputStream fis = new FileInputStream(file);
 54                 FileInputStream fis =this.openFileInput("info.txt");
 55                 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
 56                 //214342###abcdef
 57                 String info = br.readLine();
 58                 String qq = info.split("###")[0];
 59                 String pwd = info.split("###")[1];
 60                 et_qq.setText(qq);
 61                 et_pwd.setText(pwd);
 62                 fis.close();
 63             } catch (Exception e) {
 64                 e.printStackTrace();
 65             }
 66         }
 67     }
 68     /**
 69      * 登陆按钮的点击事件,在点击事件里面获取数据
 70      * @param view
 71      */
 72     public void login(View view){
 73         final String qq = et_qq.getText().toString().trim();
 74         final String pwd = et_pwd.getText().toString().trim();
 75         if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(pwd)){
 76             Toast.makeText(this, "qq号码或者密码不能为空", 0).show();
 77             return;
 78         }
 79         //判断用户是否勾选记住密码。
 80         if(cb_remember.isChecked()){
 81             //保存密码
 82             Log.i(Tag,"保存密码");
 83             try {
 84 //                File file = new File(getFilesDir(),"info.txt");
 85 //                FileOutputStream fos = new FileOutputStream(file);
 86                 FileOutputStream fos = this.openFileOutput("info.txt", 0);
 87                 //214342###abcdef
 88                 fos.write((qq+"###"+pwd).getBytes());
 89                 fos.close();
 90                 Toast.makeText(this, "保存成功", 0).show();
 91             } catch (Exception e) {
 92                 e.printStackTrace();
 93                 Toast.makeText(this, "保存失败", 0).show();
 94             }
 95         }else{
 96             //无需保存密码
 97             Log.i(Tag,"无需保存密码");
 98         }
 99         //登陆的操作,网络请求
100         AsyncHttpClient client = new AsyncHttpClient();
101         String url = getResources().getString(R.string.serverip)+"?qq="+URLEncoder.encode(qq)+"&password="+URLEncoder.encode(pwd);
102         client.get(url, new AsyncHttpResponseHandler() {
103             @Override
104             public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
105                 Toast.makeText(MainActivity.this, new String(responseBody), 0).show();
106             }
107             @Override
108             public void onFailure(int statusCode, Header[] headers,
109                     byte[] responseBody, Throwable error) {
110                 Toast.makeText(MainActivity.this, new String(responseBody), 0).show();
111             }
112         });
113     }
114
115 }

5.同样的使用开源框架post方式提交数据:

我们还是在之前的post的QQ登录案例进行讲解,我们将下载之后的loopj/android-async-http的源码代码文件复制到如下的工程中,和上面一样;接下来就是修改MainActivity.java代码,如下:

  1 package com.itheima.qqlogin;
  2
  3 import java.io.BufferedReader;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileOutputStream;
  7 import java.io.InputStream;
  8 import java.io.InputStreamReader;
  9 import java.net.HttpURLConnection;
 10 import java.net.MalformedURLException;
 11 import java.net.URL;
 12 import java.net.URLEncoder;
 13
 14 import org.apache.http.Header;
 15
 16 import com.loopj.android.http.AsyncHttpClient;
 17 import com.loopj.android.http.AsyncHttpResponseHandler;
 18 import com.loopj.android.http.RequestParams;
 19
 20 import android.app.Activity;
 21 import android.os.Bundle;
 22 import android.text.TextUtils;
 23 import android.util.Log;
 24 import android.view.View;
 25 import android.widget.CheckBox;
 26 import android.widget.EditText;
 27 import android.widget.Toast;
 28
 29 public class MainActivity extends Activity {
 30     private static final String Tag = "MainActivity";
 31     private EditText et_qq;
 32     private EditText et_pwd;
 33     private CheckBox cb_remember;
 34
 35     @Override
 36     protected void onCreate(Bundle savedInstanceState) {
 37         super.onCreate(savedInstanceState);
 38         setContentView(R.layout.activity_main);
 39         //查询关心的控件
 40         et_qq = (EditText) findViewById(R.id.et_qq);
 41         et_pwd = (EditText) findViewById(R.id.et_pwd);
 42         cb_remember = (CheckBox) findViewById(R.id.cb_remember);
 43         Log.i(Tag,"oncreate 被调用");
 44         //完成数据的回显。
 45         readSavedData();
 46     }
 47     //读取保存的数据
 48     private void readSavedData() {
 49         // getFilesDir() == /data/data/包名/files/  获取文件的路径 一般系统是不会清理的。 用户手工清理,系统会有提示。
 50         // getCacheDir()==  /data/data/包名/cache/ 缓存文件的路径 当系统内存严重不足的时候 系统会自动的清除缓存 用户手工清理系统没有提示
 51         File file = new File(getFilesDir(),"info.txt");
 52         if(file.exists()&&file.length()>0){
 53             try {
 54                 //FileInputStream fis = new FileInputStream(file);
 55                 FileInputStream fis =this.openFileInput("info.txt");
 56                 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
 57                 //214342###abcdef
 58                 String info = br.readLine();
 59                 String qq = info.split("###")[0];
 60                 String pwd = info.split("###")[1];
 61                 et_qq.setText(qq);
 62                 et_pwd.setText(pwd);
 63                 fis.close();
 64             } catch (Exception e) {
 65                 e.printStackTrace();
 66             }
 67         }
 68     }
 69     /**
 70      * 登陆按钮的点击事件,在点击事件里面获取数据
 71      * @param view
 72      */
 73     public void login(View view){
 74         final String qq = et_qq.getText().toString().trim();
 75         final String pwd = et_pwd.getText().toString().trim();
 76         if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(pwd)){
 77             Toast.makeText(this, "qq号码或者密码不能为空", 0).show();
 78             return;
 79         }
 80         //判断用户是否勾选记住密码。
 81         if(cb_remember.isChecked()){
 82             //保存密码
 83             Log.i(Tag,"保存密码");
 84             try {
 85 //                File file = new File(getFilesDir(),"info.txt");
 86 //                FileOutputStream fos = new FileOutputStream(file);
 87                 FileOutputStream fos = this.openFileOutput("info.txt", 0);
 88                 //214342###abcdef
 89                 fos.write((qq+"###"+pwd).getBytes());
 90                 fos.close();
 91                 Toast.makeText(this, "保存成功", 0).show();
 92             } catch (Exception e) {
 93                 e.printStackTrace();
 94                 Toast.makeText(this, "保存失败", 0).show();
 95             }
 96         }else{
 97             //无需保存密码
 98             Log.i(Tag,"无需保存密码");
 99         }
100         //登陆的操作,网络请求
101         AsyncHttpClient client = new AsyncHttpClient();
102         String url = getResources().getString(R.string.serverip);
103         RequestParams params = new RequestParams();
104         params.put("qq", qq);
105         params.put("password", pwd);
106         client.post(url, params, new AsyncHttpResponseHandler() {
107             @Override
108             public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
109                 Toast.makeText(MainActivity.this, new String(responseBody), 0).show();
110             }
111
112             @Override
113             public void onFailure(int statusCode, Header[] headers,
114                     byte[] responseBody, Throwable error) {
115                 Toast.makeText(MainActivity.this, new String(responseBody), 0).show();
116             }
117         });
118     }
119
120 }
时间: 2024-08-08 01:12:23

Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)的相关文章

Android 使用Post方式提交数据(登录)

在Android中,提供了标准Java接口HttpURLConnection和Apache接口HttpClient,为客户端HTTP编程提供了丰富的支持. 在HTTP通信中使用最多的就是GET和POST了,GET请求可以获取静态页面,也可以把参数放在URL字符串的后面,传递给服务器.POST与GET的不同之处在于POST的参数不是放在URL字符串里面,而是放在HTTP请求数据中. 本文将使用标准Java接口HttpURLConnection,以一个实例演示如何使用POST方式向服务器提交数据,并

Android开发学习笔记之四大组件---Activity的跳转,数据传递(二)

上一章我们温习了Activity的创建,以及各生命周期,这一章我们主要学习Activity的跳转,以及Activity之间的数据传递 一.Activity跳转: Activity之间的单纯跳转非常简单,只需要创建两个Activity,然后使用startActivity(intent)来进行跳转,看下代码: Intent uio=new Intent(thisActivityclass,ActivityBclass); startActivity(uio); Intent是什么? Android中

我的java学习笔记(21)关于框架定位

1.AWT和Swing中框架和组件类的继承层次. 2.组件类的很多方法是以获取或设置方法对形式出现的. public String getTitle(); public void setTitle(Stirng title); 3.对于类型为boolean的属性,获取方法由is开头. public boolean isLocationByPlatform(); public void setLocationByPlatform(boolean b); 4.如果没有明确地指出指定框架的大小,所有框

我的java学习笔记(20)关于框架概述

1.在java中,顶层窗口即没有包含在其他窗口中的窗口被称为框架. 2.在AWT库中有一个称为Frame的类,用于描述顶层窗口,这个类的Swing版本名为JFrame,它扩展于Frame类. 3.JFrame是极少数几个不绘制在画布上的Swing组件之一.因此,它的修饰部件由用户的窗口系统绘制,而不是由Swing绘制. 实例代码 测试类 import java.awt.*; import javax.swing.JFrame; public class test { public static

【Java学习笔记】集合框架Ⅱ

迭代 ●迭代是取出集合中元素的一种方式. ●因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器. ●用法: 第一种 for (iterator iter=iterator(); iter.hasNext();) //老外比较喜欢用这种,省内存(iter的内存),开发时用这个 { System.out.println(iter.next()); } 第二种 Iterator iter = l.iterator(); while(iter.hasNext()) {

【Java学习笔记】<集合框架>对字符串进行长度排序

1 package 测试; 2 3 import java.util.Comparator; 4 5 public class ComparatorByLength implements Comparator { //定义比较器 6 7 @Override 8 public int compare(Object o1, Object o2) { 9 String s1 = (String)o1; 10 String s2 = (String)o2; 11 12 int temp = s1.len

【Java学习笔记】集合框架Ⅰ

集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1.用于存储对象的容器. 2.集合的长度是可变的. 3.集合中不可以存储基本数据类型值. 集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架. 框架的顶层是Collection接口. Collection的常见方法: 1.添加 boolean  add(Object obj); boolean  addAll(Collection coll); 2.删

【Java学习笔记】<集合框架>TreeSet,Comparable,Comparator

1 public class Person implements Comparable{ 2 private String name; 3 private int age; 4 5 public Person(){ 6 super(); 7 } 8 public Person(String name, int age) 9 { 10 super(); 11 this.name = name; 12 this.age = age; 13 } 14 15 16 @Override 17 public

【Java学习笔记】<集合框架>使用LinkedList来模拟一个堆栈或者队列的数据结构

1 import java.util.LinkedList; 2 3 public class Test5 { 4 5 public static void main(String[] args) { 6 7 Duilie dl = new Duilie(); 8 9 dl.myAdd("abc1"); 10 dl.myAdd("abc2"); 11 dl.myAdd("abc3"); 12 dl.myAdd("abc4");