1.okHttp是squere公司出的,在Android4.0之後盛行java
2.httpClient 在5.0中棄用,在6.0以Google的sdk中沒有該apiandroid
3.httpUrlConnection 系統自帶的,用的比較頻繁api
特色:鏈接效率高,能夠異步和同步app
須要導入兩個jar包:異步
okhttp-3.0.0-RC1.jar okio-1.6.0.jar(okhttp內部依賴okio)ide
package fanggao.qf.okhttptest; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.IOException; import java.io.InputStream; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; public class MainActivity extends AppCompatActivity { private TextView textview; private static final String url = "http://m2.qiushibaike.com/article/list/text?page=1"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.btn_download); textview = (TextView) findViewById(R.id.tv_text); } /** * 點擊下載數據 * @param view */
public void onClick(View view){ //同步的方式,須要在子線程中運行,不然報錯
/* new Thread(new Runnable() { @Override public void run() { getDataForGet(); } }).start();*/
//異步 ,不須要開啓子線程
getAsyncOkHttp(); } /** * 異步:同時執行多個 * 經過get請求獲取數據 * */
private void getAsyncOkHttp() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().get().url(url).build(); //異步:
okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { final String string = response.body().String(); Log.i("tag","------"+Thread.currentThread().getId()); //只能在主線程中進行UI操做 //在主線程中進行
runOnUiThread(new Runnable() { @Override public void run() { textview.setText(string); } }); } }); } /** * 同步:一次執行一個 * 經過get請求獲取數據 */
private void getDataForGet() { try { //1.聲明okhttp客戶端
OkHttpClient okHttpClient = new OkHttpClient(); //2.構造request //1.聲明構造器 ,設置請求方式,設置請求參數
Request request = new Request.Builder().get().url(url).build(); //3.經過客戶端執行請求,得到response
Response response = okHttpClient.newCall(request).execute(); //4,判斷響應是否成功
if(response.isSuccessful()){ //得到響應實體
ResponseBody body = response.body(); //得到string
final String string = body.string(); //得到bytep[]
byte[] bytes = body.bytes(); //得到流
InputStream inputStream = body.byteStream(); //在主線程中進行
runOnUiThread(new Runnable() { @Override public void run() { textview.setText(string); } }); } Log.i("tag",Thread.currentThread().getName()); } catch (IOException e) { e.printStackTrace(); } } }
現象:ui