1.AsyncTask + URLConnectionjava
import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); findViewById(R.id.btnRead).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { readURL("https://www.baidu.com/"); } }); } public void readURL(String url) { new AsyncTask<String,Float, String>() { @Override protected String doInBackground(String... params) { try { URL url = new URL(params[0]); URLConnection connection = url.openConnection(); InputStream is = connection.getInputStream(); long total = connection.getContentLength(); InputStreamReader isr = new InputStreamReader(is,「utf-8」); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); publishProgress((float)builder.toString().length()/total); } br.close(); isr.close(); is.close(); return builder.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPreExecute() { Toast.makeText(getApplicationContext(),"開始讀取...",Toast.LENGTH_SHORT).show(); super.onPreExecute(); } @Override protected void onPostExecute(String s) { textView.setText(s); super.onPostExecute(s); } @Override protected void onProgressUpdate(Float... values) { System.err.println("--------------------" + values[0]); super.onProgressUpdate(values); } @Override protected void onCancelled(String s) { super.onCancelled(s); } @Override protected void onCancelled() { super.onCancelled(); } }.execute(url); } }
上述方法屬於get方法訪問網絡,還能夠使用post方式,好比訪問有道詞典的API:android
new AsyncTask<String,Void,Void>() { @Override protected Void doInBackground(String... params) { try { URL url = new URL(params[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true);//默認即爲true 可不寫 connection.setDoOutput(true); connection.setRequestMethod("POST"); OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(),"UTF-8") ; BufferedWriter bw = new BufferedWriter(osw); bw.write("keyfrom=andyLearnHttpGet&key=127059604&type=data&doctype=json&version=1.1&q=good"); bw.flush(); InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); isr.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } return null; } }.execute("http://fanyi.youdao.com/openapi.do");
也能夠使用Apache提供的HttpClient進行網絡通訊,雖然被棄用但目前不影響使用,只需在.gradle的android{}中加上useLibrary ‘org.apache.http.legacy’apache
get方法:json
import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.io.IOException; public class MainActivity extends AppCompatActivity { private EditText editText; private TextView textView; HttpClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); client = new DefaultHttpClient(); editText = (EditText) findViewById(R.id.editText); textView = (TextView) findViewById(R.id.textView); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { readNet("http://fanyi.youdao.com/openapi.do?keyfrom=andyLearnHttpGet&key=127059604&type=data&doctype=json&version=1.1&q="+ editText.getText()); } }); } public void readNet(String url) { new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... params) { String urlStr = params[0]; HttpGet get = new HttpGet(urlStr); try { HttpResponse response = client.execute(get); String value = EntityUtils.toString(response.getEntity()); System.out.println("-------------------------" + value); return value; } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText(s); } }.execute(url); } }
post方法:api
import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.TextView; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private EditText editText; private TextView textView; HttpClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); client = new DefaultHttpClient(); editText = (EditText) findViewById(R.id.editText); textView = (TextView) findViewById(R.id.textView); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { readNet("http://fanyi.youdao.com/openapi.do?keyfrom=andyLearnHttpGet&key=127059604&type=data&doctype=json&version=1.1" ,editText.getText().toString()); } }); } public void readNet(String url,String in) { new AsyncTask<String, Void, String>() { @Override protected String doInBackground(String... params) { String urlStr = params[0]; HttpPost post = new HttpPost(urlStr); try { List<BasicNameValuePair> list = new ArrayList<>(); list.add(new BasicNameValuePair("q", params[1])); post.setEntity(new UrlEncodedFormEntity(list)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { HttpResponse response = client.execute(post); String value = EntityUtils.toString(response.getEntity()); System.out.println("-------------------------" + value); return value; } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText(s); } }.execute(url,in); } }
------------------------------------------------------------- 緩存
2.Google開源庫-Volleycookie
Volley適合數據量不大可是通訊頻繁的場景。網絡
下載volley.jar庫放到libs中併發
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" /> <com.android.volley.toolbox.NetworkImageView android:id="@+id/volleyImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@+id/imageView" android:layout_toRightOf="@+id/imageView" /> </RelativeLayout>
package com.zhang.myvolley; /** * Volley是Android平臺網絡通訊庫:更快、更簡單、更健壯 * Volley提供的功能: * 1.Json、圖片(異步) * 2.網絡請求的排序 * 3.網絡請求優先級處理 * 4.緩存 * 5.多級別的取消請求 * 6.與Activity生命週期聯動 * <p> * 獲取Volley */ import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.LruCache; import android.widget.ImageView; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.NetworkImageView; import com.android.volley.toolbox.Volley; import org.json.JSONObject; public class MainActivity extends AppCompatActivity { private ImageView imageView; private NetworkImageView networkImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); getJSONVolley(); } public void init() { imageView = (ImageView) findViewById(R.id.imageView); networkImageView = (NetworkImageView) findViewById(R.id.volleyImageView); loadImageVolley(); netWorkImageViewVolley(); } //獲取json字符串 public void getJSONVolley() { RequestQueue requestQueue = Volley.newRequestQueue(this); String JSONDateUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=andyLearnHttpGet&key=127059604&type=data&doctype=json&version=1.1&q=good"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, JSONDateUrl, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println("response = " + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("對不起,有問題"); } } ); requestQueue.add(jsonObjectRequest); } //獲取圖片加載 public void loadImageVolley() { String imageUrl = "http://10.0.3.2/image.jpg"; RequestQueue requestQueue = Volley.newRequestQueue(this); final LruCache<String, Bitmap> lruCache = new LruCache<>(20); ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String s) { return lruCache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { lruCache.put(s, bitmap); } }; ImageLoader imageLoader = new ImageLoader(requestQueue, imageCache); ImageLoader.ImageListener listener = imageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher); imageLoader.get(imageUrl, listener); } //NetWorkImageViewVolley public void netWorkImageViewVolley() { String imageUrl = "http://10.0.3.2/image.jpg"; RequestQueue requestQueue = Volley.newRequestQueue(this); final LruCache<String, Bitmap> lruCache = new LruCache<>(20); ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String s) { return lruCache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { lruCache.put(s, bitmap); } }; ImageLoader imageLoader = new ImageLoader(requestQueue, imageCache); networkImageView.setTag("url"); networkImageView.setImageUrl(imageUrl, imageLoader); } }
Volley特色:app
能使網絡通訊更快,更簡單;
Get、Post網絡請求及網絡圖像的高效率異步處理請求;
能夠對網絡請求進行排序優先級管理;
網絡請求的緩存;
多級別取消請求;
和Activity生命週期的聯動。
與Activity生命週期聯動能夠在Application中建立RequestQueue:
public class MyApplication extends Application { public static RequestQueue queue; @Override public void onCreate() { super.onCreate(); queue = Volley.newRequestQueue(getApplicationContext()); } public static RequestQueue getHttpQueue(){ return queue; } }
使用時對Request設置tag,應用結束時cancelAll:
private void Volley_Get() { String url = "http://fanyi.youdao.com/openapi.do?keyfrom=andyLearnHttpGet&key=127059604&type=data&doctype=json&version=1.1&q=good"; StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String s) { System.out.println(s); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("Error"); } }); request.setTag("abcGet"); MyApplication.getHttpQueue().add(request); } private void Volley_Post() { String url = "http://fanyi.youdao.com/openapi.do"; StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String s) { System.out.println(s); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("Error"); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { HashMap<String, String> map = new HashMap<>(); map.put("keyfrom","andyLearnHttpGet"); map.put("key","127059604"); map.put("type","data"); map.put("doctype","json"); map.put("version","1.1"); map.put("q","good"); return map; } }; request.setTag("abcPost"); MyApplication.getHttpQueue().add(request); }
@Override protected void onStop() { super.onStop(); MyApplication.getHttpQueue().cancelAll("abcGet"); MyApplication.getHttpQueue().cancelAll("abcPost"); }
--------------------------------------------------------
3.Async-http
特色:
清晰的網絡請求回調;
請求使用ThreadPool,限制併發資源使用狀況;
GET/POST基於參數構建使用(RequestParams),比較方便;
Multipart文件上傳,大數據上傳下載;
自動智能請求重試,優化了質量不一的移動鏈接;
內置響應解析成JSON,使用JsonHttpResponseHandler;
持久化cookie存儲,保存cookie到應用程序的SharedPreferences;
二進制文件(圖片等)的下載,使用BinaryHttpResponseHandler。
-get方式:
private void asyncHttpGet() { AsyncHttpClient client = new AsyncHttpClient(); String url = "http://fanyi.youdao.com/openapi.do?keyfrom=andyLearnHttpGet&key=127059604&type=data&doctype=json&version=1.1&q=good"; client.get(url,new AsyncHttpResponseHandler(){ @Override public void onSuccess(String s) { super.onSuccess(s); System.out.println(s); } @Override public void onFailure(Throwable throwable) { super.onFailure(throwable); System.out.println("--------------失敗-----------------"); } }); }
-post方式:
private void asyncHttpPost() { AsyncHttpClient client = new AsyncHttpClient(); String url = "http://fanyi.youdao.com/openapi.do"; RequestParams params = new RequestParams(); params.put("keyfrom","andyLearnHttpGet"); params.put("key","127059604"); params.put("type","data"); params.put("doctype","json"); params.put("version","1.1"); params.put("q","good"); client.post(url, params, new AsyncHttpResponseHandler() { @Override public void onSuccess(String s) { super.onSuccess(s); System.out.println(s); } @Override public void onFailure(Throwable throwable) { super.onFailure(throwable); System.out.println("--------------失敗-----------------"); } }); }
能夠對這兩個一塊兒封裝一下:
package com.zhang.asynchttpdemo; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.RequestParams; /** * Created by Mr.Z on 2016/4/4 0004. */ public class RequestUtils { public static AsyncHttpClient client = new AsyncHttpClient(); public static void ClientGet(String url, NetCallBack netCallBack) { client.get(url, netCallBack); } public static void ClientPost(String url, RequestParams params, NetCallBack netCallBack) { client.post(url, params, netCallBack); } }
package com.zhang.asynchttpdemo; import android.util.Log; import com.loopj.android.http.AsyncHttpResponseHandler; /** * Created by Mr.Z on 2016/4/4 0004. */ public abstract class NetCallBack extends AsyncHttpResponseHandler { @Override public void onStart() { Log.i("info","請求開始,彈出進度條框"); super.onStart(); } @Override public void onSuccess(String s) { Log.i("info","請求成功,隱藏進度條框:" + s); onMySuccess(s); super.onSuccess(s); } @Override public void onFailure(Throwable throwable) { Log.i("info","請求失敗,隱藏進度條框:" + throwable); onMyFailure(throwable); super.onFailure(throwable); } public abstract void onMySuccess(String s); public abstract void onMyFailure(Throwable throwable); }
private void httpClientPost() { String url = "http://fanyi.youdao.com/openapi.do"; RequestParams params = new RequestParams(); params.put("keyfrom","andyLearnHttpGet"); params.put("key","127059604"); params.put("type","data"); params.put("doctype","json"); params.put("version","1.1"); params.put("q","good"); RequestUtils.ClientPost(url,params,new NetCallBack(){ @Override public void onMySuccess(String s) { //可以使用界面UI } @Override public void onMyFailure(Throwable throwable) { } }); }