Android(java)学习笔记156:开源框架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-masterlibrarysrcmainjava

同时这里我已经不在需要之前的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 }

 

原文地址:https://www.cnblogs.com/hebao0514/p/4785026.html