Android基於Http網絡通訊

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) {

        }
    });
}
相關文章
相關標籤/搜索