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 }