Android基于Http网络通信

1.AsyncTask + URLConnection

 

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:

 

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’

 

get方法:

 

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方法:

 

 

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开源库-Volley

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特点:

 

能使网络通信更快,更简单;

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

        }
    });
}

 

posted @ 2016-12-19 23:38  changchou  阅读(232)  评论(0编辑  收藏  举报