使用Picasso和okhttp以及AsyncTask加载网络图片

效果:

代码地址:

https://github.com/AndroidDerek

依赖:

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
权限:
<uses-permission android:name="android.permission.INTERNET"/>

 

 

代码

1.PicassoOne

package com.example.picassoone;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by Administrator on 2017/4/15 0015.
 * 使用Picasso和okhttp以及AsyncTask加载网络图片
 */

public class PicassoOne extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "GsonUtils";
    private static final int SUCCESS = 1;
    private static final int ERROR = 1;
    private ListView listView;
    private Button button;
    private Button asynctask;
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picasso_one);
        initView();
        progressDialog = new ProgressDialog(PicassoOne.this);
    }

    private void initView() {
        listView = (ListView) findViewById(R.id.listView);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        asynctask = (Button) findViewById(R.id.asynctask);
        asynctask.setOnClickListener(this);
    }

    private MyBaseAdapter myBaseAdapter;
    private MyOnScrollListener myOnScrollListener;
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == SUCCESS) {
                Log.d(TAG, "SUCCESS");
                String json = (String) msg.obj;
                //服务器的数据获取成功
                try {
                    String iconUrlTest = new JSONObject(json).getJSONArray("info").getJSONObject(0).getString("icon");
                    Log.d(TAG, "iconUrlTest=" + iconUrlTest);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                List<InfoItem> infoItemList = new ArrayList<>();
                try {
                    JSONArray infos = new JSONObject(json).getJSONArray("info");
                    for (int i = 0; i < infos.length(); i++) {
                        InfoItem infoItem = new InfoItem();
                        JSONObject info = infos.getJSONObject(i);
                        infoItem.setIcon(info.getString("icon"));
                        infoItem.setName(info.getString("name"));
                        infoItem.setSize(info.getString("size"));
                        infoItemList.add(infoItem);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    Log.d(TAG, "JSONException=" + e.toString());
                }
                //使用Picasso展示图片
                myBaseAdapter = null;
                isUtf8 = false;
                myBaseAdapter = new MyBaseAdapter(infoItemList);
                listView.setAdapter(myBaseAdapter);
                myOnScrollListener = new MyOnScrollListener();
                listView.setOnScrollListener(myOnScrollListener);
            }
        }
    };

    boolean isUtf8 = false;

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                Log.d(TAG, "button");
                //开启子线程
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String url = "http://mobileapi.72g.com/index.php?tp=andv4/index_new&op=jifen&point=100";
                        OkHttpClient okHttpClient = new OkHttpClient();
                        Request request = new Request.Builder()
                                .url(url)
                                .get()
                                .build();
                        try {
                            Response response = okHttpClient.newCall(request).execute();
                            //
                            if (response.isSuccessful()) {
                                //获取数据成功
                                String json = response.body().string();
                                Message message = Message.obtain();
                                message.obj = json;
                                message.what = SUCCESS;
                                handler.sendMessage(message);
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                            Log.d(TAG, "IOException=" + e.toString());
                        }
                    }
                }).start();
                break;
            case R.id.asynctask:
                progressDialog.setTitle("loading...");
                String url_get = "http://mobileapi.72g.com/index.php?tp=andv4/index_new&op=jifen&point=100";
                //使用AsyncTask来处理网络请求
                MyAsyncTask myAsyncTask = new MyAsyncTask();
                myAsyncTask.execute(url_get);
                break;
        }
    }

    /**
     * listview的适配器
     */
    class MyBaseAdapter extends BaseAdapter {
        private List<InfoItem> infoItemList;

        public MyBaseAdapter(List<InfoItem> infoItemList) {
            this.infoItemList = infoItemList;
        }

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

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

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ViewHolder viewHolder = null;
            if (null == view) {
                view = getLayoutInflater().inflate(R.layout.list_item, viewGroup, false);
                viewHolder = new ViewHolder();
                viewHolder.name = (TextView) view.findViewById(R.id.name);
                viewHolder.size = (TextView) view.findViewById(R.id.size);
                viewHolder.icon = (ImageView) view.findViewById(R.id.icon);
                view.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) view.getTag();
            }
            InfoItem infoItem = infoItemList.get(i);

            String name = infoItem.getName();

            //需要把GBK的乱码转换成UTF-8
            Log.d(TAG, "isUtf8=" + isUtf8);
            if (!isUtf8) {
                try {
                    name = new String(name.getBytes("gbk"), "utf-8");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    Log.d(TAG, "UnsupportedEncodingException=" + e.toString());
                }
            }
            viewHolder.name.setText(name);
            viewHolder.size.setText(infoItem.getSize());
            //picasso展示图片;fit为图片的宽高填充父窗体
            Picasso.with(viewGroup.getContext())
                    .load(infoItem.getIcon())
                    .fit()
                    .placeholder(R.drawable.loading)
                    .into(viewHolder.icon);
            return view;
        }
    }

    private static class ViewHolder {
        TextView name;
        TextView size;
        ImageView icon;
    }

    /**
     * 当手指快速滑动的时候,Picasso不进行图片资源的加载展示,可以大大节约内存资源
     */
    class MyOnScrollListener implements AbsListView.OnScrollListener {

        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {
            Picasso picasso = Picasso.with(absListView.getContext());
            //当处于触摸滑动的时候,或者处于停滞的时候
            if (i == SCROLL_STATE_IDLE || i == SCROLL_STATE_TOUCH_SCROLL) {
                picasso.resumeTag(absListView.getContext());
            } else {
                Log.d(TAG, "picasso.pauseTag");
                picasso.pauseTag(absListView.getContext());
            }
        }

        @Override
        public void onScroll(AbsListView absListView, int i, int i1, int i2) {

        }
    }


    class MyAsyncTask extends AsyncTask<String, Void, List<InfoItem>> {

        //在准备加载前
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();
        }

        /**
         * 在后台执行
         *
         * @param strings
         * @return
         */
        @Override
        protected List<InfoItem> doInBackground(String... strings) {

            try {
                URL url = new URL(strings[0]);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                InputStream inputStream = urlConnection.getInputStream();
                int responseCode = urlConnection.getResponseCode();
                Log.d(TAG, "responseCode=" + responseCode);
                //请求服务器数据成功
                if (responseCode == 200) {
                    //InputStream 转换成 String
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    int len = 0;
                    byte[] buffers = new byte[1024];
                    while ((len = inputStream.read(buffers)) != -1) {
                        byteArrayOutputStream.write(buffers, 0, len);
                    }
                    String json = byteArrayOutputStream.toString();
                    Log.d(TAG, "json=" + json);
                    //解析json数据,保存到集合中
                    try {
                        String iconUrlTest = new JSONObject(json).getJSONArray("info").getJSONObject(0).getString("icon");
                        Log.d(TAG, "iconUrlTest=" + iconUrlTest);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    List<InfoItem> infoItemList = new ArrayList<>();
                    try {
                        JSONArray infos = new JSONObject(json).getJSONArray("info");
                        for (int i = 0; i < infos.length(); i++) {
                            InfoItem infoItem = new InfoItem();
                            JSONObject info = infos.getJSONObject(i);
                            infoItem.setIcon(info.getString("icon"));
                            infoItem.setName(info.getString("name"));
                            infoItem.setSize(info.getString("size"));
                            infoItemList.add(infoItem);
                        }
                        //解析json数据成功,返回集合
                        return infoItemList;
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.d(TAG, "JSONException=" + e.toString());
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.d(TAG, "IOException=" + e.toString());
            }
            return null;
        }

        /**
         * 在ui主线程中执行
         *
         * @param infoItems
         */
        @Override
        protected void onPostExecute(List<InfoItem> infoItems) {
            super.onPostExecute(infoItems);
            //清空之前的缓存
            myBaseAdapter = null;
            isUtf8 = true;
            if (null != infoItems) {
                //展示图片
                myBaseAdapter = new MyBaseAdapter(infoItems);
                listView.setAdapter(myBaseAdapter);
                progressDialog.dismiss();
                myOnScrollListener = new MyOnScrollListener();
                listView.setOnScrollListener(myOnScrollListener);
            }
        }
    }
}

2.InfoItem数据类

package com.example.picassoone;

/**
 * Created by Administrator on 2017/4/17 0017.
 */

public class InfoItem {
    private String name;
    private String size;
    private String icon;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }
}

 

布局

1.主界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="开启子线程加载数据"/>
    <Button
        android:id="@+id/asynctask"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="使用asynctask加载数据"/>
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />

</LinearLayout>

2listview条目界面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="name"/>
    <TextView
        android:id="@+id/size"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="size"/>
    <ImageView
        android:id="@+id/icon"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        />

</LinearLayout>

。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值