HttpURLConnectionh和HttpClient访问网络资源

来源:互联网 发布:双色球万能矩阵必中6码 编辑:程序博客网 时间:2024/05/16 14:09

一、MainActivity 主线程

package news1510a.bawei.com.a04_zhou_test;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.google.gson.Gson;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

/**
 * 去掉标题在这里写requestWindownFeatrue不管用
 *
 * 使用theme主题去去除标题
 */
public class MainActivity extends AppCompatActivity {

    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.list_view);



    }

    /**
     * 使用httpClient获取数据...点击事件
     *
     * 一般情况下httpClient是没有问题的,,,但是对于一些路径可能会出现问题
     *
     * javax.net.ssl.SSLException: hostname in certificate didn't match: <api.tianapi.com> != <*.sinaapp.com> OR <*.sinaapp.com> OR <sinaapp.com>
     *
     * 解决办法:http://blog.csdn.net/ITermeng/article/details/52937158?locationNum=1&fps=1
     * @param view
     */
    public void getDataByClient(View view){
        //第一个是参数的意思,,,一般是url地址,,Void,,,第二个是异步任务执行的进度,,Void,,第三个是结果泛型,,,String
        AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {

            //运行在后台...类似子线程,,,做耗时的操作(访问网络的操作)
            @Override
            protected String doInBackground(Void... voids) {
                try {
                    /**
                     * httpClient已经过时了,在使用的时候需要在build,grandle下面加一行代码,去支持httpClient
                     */

                    SSLSocketFactory.getSocketFactory().setHostnameVerifier(new AllowAllHostnameVerifier());

                    String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10";

                    //1.创建一个客户端对象
                    HttpClient client = new DefaultHttpClient();
                    //2.创建一个请求的对象...请求的对象可以是get也可以是post
                    HttpGet httpGet = new HttpGet(path);

                    //3.客户端对象执行get请求....返回值是一个响应的对象
                    HttpResponse httpResponse = client.execute(httpGet);

                    //获取状态码
                    int statusCode = httpResponse.getStatusLine().getStatusCode();
                    if (statusCode == 200) {
                        //获取响应的实体内容...字节流...先获取实体内容的对象...在获取内容
                        InputStream inputStream = httpResponse.getEntity().getContent();

                        String json = streamToString(inputStream, "utf-8");

                        //返回
                        return json;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }


                return null;
            }

            //接收到doInBackground发送回来的数据....处于主线程,,,更新界面的操作写在这里
            @Override
            protected void onPostExecute(String s) {//s就是doInBackground返回的json数据

                //在这里接收到doInBackground返回的json数据,,,解析设置适配器
                Gson gson = new Gson();

                DataDataBean dataDataBean = gson.fromJson(s, DataDataBean.class);

                final List<DataDataBean.NewslistBean> newslist = dataDataBean.getNewslist();

                //设置适配器
                MyAdapter myAdapter = new MyAdapter(newslist, MainActivity.this);

                listView.setAdapter(myAdapter);

                /**
                 * 条目的点击事件
                 */
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                        Intent intent = new Intent(MainActivity.this,DetailActivity.class);

                        intent.putExtra("url",newslist.get(i).getUrl());

                        startActivity(intent);
                    }
                });

            }
        };

        /**
         * 异步任务要执行,,,需要手动的去调用excute方法
         */
        asyncTask.execute();

    }

    /**
     * 使用httpUrlConnection获取...点击事件
     * @param view
     */
    public void getDataByConnection(View view){

        AsyncTask<Void, Void, String> asyncTask = new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... voids) {

                String path = "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10";

                try {
                    URL url = new URL(path);

                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    //设置
                    connection.setRequestMethod("GET");
                    connection.setReadTimeout(5000);
                    connection.setConnectTimeout(5000);

                    //获取
                    int responseCode = connection.getResponseCode();
                    if (responseCode == 200){
                        InputStream inputStream = connection.getInputStream();

                        String json = streamToString(inputStream, "utf-8");

                        //返回
                        return json;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                //在这里接收到doInBackground返回的json数据,,,解析设置适配器
                Gson gson = new Gson();

                DataDataBean dataDataBean = gson.fromJson(s, DataDataBean.class);

                List<DataDataBean.NewslistBean> newslist = dataDataBean.getNewslist();

                //设置适配器
                MyAdapter myAdapter = new MyAdapter(newslist, MainActivity.this);

                listView.setAdapter(myAdapter);
            }
        };


        //执行
        asyncTask.execute();

    }

    /**
     * 把一个字节流转换为字符串的方法
     *
     * @param inputStream
     * @param charset
     * @return
     */
    private String streamToString(InputStream inputStream,String charset) {
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);

            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String s = null;
            StringBuilder builder = new StringBuilder();
            while ((s = bufferedReader.readLine()) != null){
                builder.append(s);
            }

            bufferedReader.close();
            return builder.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return  null;
    }
}


二、封装实体类

package news1510a.bawei.com.a04_zhou_test;

import java.util.List;

/**
 * @author Dash
 * @date 2017/10/8
 * @description:
 */
public class DataDataBean {

    /**
     * code : 200
     * msg : success
     * newslist : [{"ctime":"2017-10-08","title":"作为皇帝的大舅子,清朝的大将军,虎将,为何连跌14级成看门","description":"吉祥满族","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-51956944.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428022&signature=OmTqiFObUQ-VsIYT77SqXIZukZFhIAWNjVua4NwSNgZWOrEUjt9DIVB05CyDC8USXF14QrhcNALZ*CwE4-Dy4Bm8rSV31reOXyO2EVIAoJU="},{"ctime":"2017-10-08","title":"不想认命,就去拼命!","description":"爱上英伦风","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-51965372.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428022&signature=hkS4P-6VCxT4aXbAGaRa8Xs1vopcWZ*gZdAGUXilTqrknRxfRo-ehbtPZ1MaojaCrOn5xzo*qpK*qt8-y4YKR1kPUDlkzLHG4KfTMrwmH4c="},{"ctime":"2017-10-08","title":"高晓松:我教育女儿,心安理得混日子","description":"知儿网","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-47404735.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428022&signature=HaXxs0bkH86vMoqPlJUbt1PnpS6Jp8iSWzhGUvabHC3W4SRBCZpx2AM7BbDMStcH6wKXQ9y3RnUTGlwO1UAoOgFDcEKzZQAwDQP7zzef4Vc="},{"ctime":"2017-10-08","title":"我喜欢年老,它给了我自由!(激励千万人)","description":"中国老干部","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-51963554.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428022&signature=iozuLZHfATnDSZFU1LtfMTKMyMwaJkKt9uAL70NCuVhqHQzGjlg0wXn5qYsST97WOnKZChUG5YReqLfnOf50iBdsQR3jRSwfLYwmugfw5uQ="},{"ctime":"2017-10-08","title":"很多时候,成长与舒适,不可共存!","description":"智联招聘HR公会","picUrl":"https://t1.qpic.cn/mblogpic/f01a972dbcc1060fd456/2000","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428021&signature=5qiVxYKRyae8WuOMKJYG4o0o3EVv1Sqkseeitq2*lXQq4mfnR0MvNrxgO5JzMkICREpK46UMSV0AqanuH-Rofx8k9tXgNzQ8xTG5EllbpJU="},{"ctime":"2017-10-08","title":"人生不在于获得,而在于放下!","description":"每日一禅","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-51962244.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428021&signature=TAyl66MtGI6xW*OQOVCDynWDW5jVe33-R2mlmGcaGcA3XIwndC7m-VtmJK6dP8IluO4RS7UtGh9jsIS9DCwo57LUUtYw5hXw5-2gwVgQSYI="},{"ctime":"2017-10-08","title":"别忘了,你是活给自己看的!","description":"品茶时刻","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-50520645.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428021&signature=iobDkv7nQqX-5CmzvIAQ3hEoy*ze0VKDl7Uc8Pus8Ra*mP6W14u*KnD8gNze4PRReB0LAcCMwn9EbIEDgvuDb1U8Mkvb-PxRsKc4ugom7Ic="},{"ctime":"2017-10-08","title":"这样发朋友圈的女生,真的很掉价!","description":"壹课","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-13578048.static/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428020&signature=-csO*RirbaJc*xhezR6PUCI2FJ8ojRLcjqV4*E7r39RURf0fIViYHk9HBDcOElJ8ee8BR-fti-ryuXPpV-irBjwec0KaN112qe1ZYSOLtfM="},{"ctime":"2017-10-08","title":"\u201c子孙非我有\u201d,这句古话你赞不赞同?","description":"夜光杯","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-51964888.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428020&signature=UxV9xVPillUyTfagg4o*ZA4S3EjHjrDxnqw7t2gZmj6iXS5aaqCxoWSU-kbuoslosL7ZC0n44s1*Ffcsbbcqg*MVs48GJXv4IxSEHlrRi5c="},{"ctime":"2017-10-08","title":"读经明义丨荀子:为人如土 隐微而显明","description":"腾讯儒学","picUrl":"https://zxpic.gtimg.com/infonew/0/wechat_pics_-51964820.jpg/640","url":"https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428020&signature=lUwGIALO8bnBR7UAunAzYtgtlqP7eJnc8UwbjtW1pCQnSY68mW8DvE0r7AoRxjxqO*w20ZLvkjV8Cp9-s9h083KuI1aOlT-*VW3i1iLOzPo="}]
     */

    private int code;
    private String msg;
    private List<NewslistBean> newslist;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<NewslistBean> getNewslist() {
        return newslist;
    }

    public void setNewslist(List<NewslistBean> newslist) {
        this.newslist = newslist;
    }

    public static class NewslistBean {
        /**
         * ctime : 2017-10-08
         * title : 作为皇帝的大舅子,清朝的大将军,虎将,为何连跌14级成看门
         * description : 吉祥满族
         * picUrl : https://zxpic.gtimg.com/infonew/0/wechat_pics_-51956944.jpg/640
         * url : https://mp.weixin.qq.com/s?src=16&ver=413&timestamp=1507428022&signature=OmTqiFObUQ-VsIYT77SqXIZukZFhIAWNjVua4NwSNgZWOrEUjt9DIVB05CyDC8USXF14QrhcNALZ*CwE4-Dy4Bm8rSV31reOXyO2EVIAoJU=
         */

        private String ctime;
        private String title;
        private String description;
        private String picUrl;
        private String url;

        public String getCtime() {
            return ctime;
        }

        public void setCtime(String ctime) {
            this.ctime = ctime;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getPicUrl() {
            return picUrl;
        }

        public void setPicUrl(String picUrl) {
            this.picUrl = picUrl;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

三、适配器
package news1510a.bawei.com.a04_zhou_test;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * @author Dash
 * @date 2017/10/8
 * @description:
 */
public class MyAdapter extends BaseAdapter {
    List<DataDataBean.NewslistBean> list;
    Context context;

    public MyAdapter(List<DataDataBean.NewslistBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if (view == null){
            view = View.inflate(context,R.layout.item_layou,null);

            holder = new ViewHolder();

            holder.imageView = view.findViewById(R.id.image_view);
            holder.text_time = view.findViewById(R.id.text_time);
            holder.text_title = view.findViewById(R.id.text_title);

            view.setTag(holder);

        }else {
            holder = (ViewHolder) view.getTag();
        }

        //赋值
        holder.text_title.setText(list.get(i).getTitle());
        holder.text_time.setText(list.get(i).getCtime());

        //显示图片....
        /**
         * 为什么图片会产生错位 闪烁?????图片是异步加载+复用的优化的原因
         *
         * 1.imageView要跟自己的url路径匹配起来
         */
        holder.imageView.setTag(list.get(i).getPicUrl());

        //3.设置默认显示的图片
        holder.imageView.setImageResource(R.mipmap.ic_launcher);

        //2.在这个位置能区分出来imageView是当前的控件...借助接口回调的形式把异步获取的图片传递过来
        new ImageHelper().dispalyImage(list.get(i).getPicUrl(),holder.imageView, new ImageCallBack() {
            @Override
            public void setSuccessImage(Bitmap bitmap, ImageView imageView) {

                if (imageView.getTag().equals(list.get(i).getPicUrl())){

                    //
                    imageView.setImageBitmap(bitmap);
                }
            }
        });

        return view;
    }



    private class ViewHolder{
        ImageView imageView;
        TextView text_title;
        TextView text_time;
    }
}

四、接口

package news1510a.bawei.com.a04_zhou_test;

import android.graphics.Bitmap;
import android.widget.ImageView;

/**
 * @author Dash
 * @date 2017/10/8
 * @description:
 */
public interface ImageCallBack {
    public void setSuccessImage(Bitmap bitmap, ImageView imageView);
}

五、加载列表图片

package news1510a.bawei.com.a04_zhou_test;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author Dash
 * @date 2017/10/8
 * @description:
 */
public class ImageHelper {


    public void dispalyImage(final String picUrl, final ImageView imageView, final ImageCallBack imageCallBack) {
        AsyncTask<Void, Void, Bitmap> asyncTask = new AsyncTask<Void, Void, Bitmap>() {
            @Override
            protected Bitmap doInBackground(Void... voids) {

                try {
                    URL url = new URL(picUrl);

                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                    //设置
                    connection.setRequestMethod("GET");
                    connection.setReadTimeout(5000);
                    connection.setConnectTimeout(5000);
                    //获取
                    int responseCode = connection.getResponseCode();
                    if (responseCode == 200){
                        InputStream inputStream = connection.getInputStream();

                        //转成bitmap
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                        return bitmap;

                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {

                /*if (imageView.getTag().equals(picUrl)){
                    //设置
                    imageView.setImageBitmap(bitmap);

                }*/

                imageCallBack.setSuccessImage(bitmap,imageView);

            }
        };

        asyncTask.execute();
    }
}

六、点击条目跳转到第二个 Activity

package news1510a.bawei.com.a04_zhou_test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class DetailActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        //先获取传递的路径
        String url = getIntent().getStringExtra("url");

        //展示到webView上
        webView = (WebView) findViewById(R.id.web_view);

        webView.loadUrl(url);

        //设置
        //在当前的activity加载,,,而不是浏览器去加载
        webView.setWebViewClient(new WebViewClient());

        //webView.setWebChromeClient();//这个是js与android原生app进行交互的时候可以使用

        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        //设置支持js自动弹窗
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
    }
}