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

        }
    });
}



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值