利用百度APIStoreSDK获取Json数据并解析加载到ListView上


效果图(这里只是截取了List中的一项):

利用百度APIStoreSDK获取Json数据并解析加载到ListView上_第1张图片

一、:登录百度ApiStore,获取移动sdk Android版(同时有使用文档和示例),将jar包导入到项目中

Android Studio请在放入libs目录后,在project structure-> Dependencies-> File Dependency中添加jar包依赖。

在AndroidManifest.xml中,加入所需权限,这些权限将帮助sdk判断网络状态:


<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>

<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>


在调用APIStoreSDK的接口前需要进行初始化, 这一步必须在Application中完成。

你需要在项目中建立一个继承自Application的类,并在项目配置文件AndroidManifest.xml中application标签下android:name中指定该类:

android:name=".MyApplication"

MyApplication中添加的代码如下:
import android.app.Application;
import com.baidu.apistore.sdk.ApiStoreSDK;

public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        ApiStoreSDK.init(this, "这里填写在百度ApiStore获取的apikey");
    }
}

APIStoreSDK封装了完整的异步网络请求和回调逻辑,回调要继承ApiCallBack类并改写其中的onSuccess()、onError()、onComplete()方法(如不需要,可不用都写)。onSuccess会在请求成功时调用,onError会在请求失败时调用,onComplete总是会调用。responseString是api接口返回的响应字符串,或者空(请求失败时)。(以上内容来自为百度ApiStoreSdk说明文档)


在MainActivity中调用的如下:

private void apiTest() {
        Parameters para = new Parameters();
        //接口请求参数
        para.put("num",10);
        //这里访问的是美女图片的接口地址
        ApiStoreSDK.execute("http://apis.baidu.com/txapi/mvtp/meinv",
                ApiStoreSDK.GET,
                para,
                new ApiCallBack() {
                    @Override
                    public void onSuccess(int status, String responseString) {
                        Log.i("API Store", "onSuccess");
                        //responseString为返回的Json数据
                        //将获取的Json数据解析并加载到自定义的ListView中,下面会有说明
                        new HttpJson(listView, adapter, handler, responseString).start();
                    }

                    @Override
                    public void onComplete() {
                        Log.i("API Store", "onComplete");
                    }
                    @Override
                    public void onError(int status, String responseString, Exception e) {
                        Log.i("API Store", "onError, status: " + status);
                        Log.i("API Store", "errMsg: " + (e == null ? "" : e.getMessage()));
                        Log.i("API Store",getStackTrace(e));
                    }
                });
    }

    String getStackTrace(Throwable e) {
        if (e == null) {
            return "";
        }
        StringBuilder str = new StringBuilder();
        str.append(e.getMessage()).append("\n");
        for (int i = 0; i < e.getStackTrace().length; i++) {
            str.append(e.getStackTrace()[i]).append("\n");
        }
        return str.toString();
    }


 
    以上就完成了Json数据的获取,接下来需要解析Json数据,解析Json数据就是确定Json数据的格式,并从中获取需要的数据,可以在onSuccess方法中通过打印Log来查看Json数据,将其复制到网上在线格式化确定其格式,每种格式解析方式都大同小异,下面只针对本例返回值讲解,贴出responString中数据格式化后的结果(由于默认返回值为10,这里只截取3个用作演示): 
    
{
    "code": 200,
    "msg": "success",
    "newslist": [
        {
            "ctime": "2016-03-06 14:11",
            "title": "巨乳杉原杏璃 Anri Sugihara 写真集 Gravure Idols & Misty C",
            "description": "美女图片",
            "picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/06/m.xxxiao.com_d458e312c6ff6ca3126749ecd922dbf6-760x500.jpg",
            "url": "http://m.xxxiao.com/1644"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "韩国性感车模制服展场靓丽图片",
            "description": "美女图片",
            "picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_8000d44d92b4ea5aba46b13bd938e0e48-760x500.jpg",
            "url": "http://m.xxxiao.com/892"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "[TGOD推女神] 性感少妇Aline艾琳私房写真",
            "description": "美女图片",
            "picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_26da7f08a6170deda90a8bcd208618f9-760x500.jpg",
            "url": "http://m.xxxiao.com/249"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "充气娃娃王依萌制服诱惑性爱美女",
            "description": "美女图片",
            "picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_b3149ecea4628efd23d2f86e5a72347218-760x500.jpg",
            "url": "http://m.xxxiao.com/775"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "咖啡馆邂逅忧伤的姑娘",
            "description": "美女图片",
            "picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_6bb61e3b7bce0931da574d19d1d82c88-690x500.jpg",
            "url": "http://m.xxxiao.com/123"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "清新美眉爱上金鱼唯美写真",
            "description": "美女图片",
            "picUrl": "http://t1.27270.com/uploads/150725/8-150H5103439118.jpg",
            "url": "http://www.27270.com/ent/meinvtupian/2015/51488.html"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "短发美女激情劲爆性感艺术照",
            "description": "美女图片",
            "picUrl": "http://t1.27270.com/uploads/150725/8-150H5155Rb36.jpg",
            "url": "http://www.27270.com/ent/meinvtupian/2015/51899.html"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "美女旗袍红唇恋上香烟艺术照",
            "description": "美女图片",
            "picUrl": "http://t1.27270.com/uploads/150725/8-150H5153A5D6.jpg",
            "url": "http://www.27270.com/ent/meinvtupian/2015/51904.html"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "嫩模郭南汐变身清纯美女秘书",
            "description": "美女图片",
            "picUrl": "http://t1.27270.com/uploads/150727/8-150HFZ92R48.jpg",
            "url": "http://www.27270.com/ent/meinvtupian/2015/50564.html"
        },
        {
            "ctime": "2016-03-06 14:11",
            "title": "火辣红妆爆乳车模张雅琦魅惑壁纸",
            "description": "美女图片",
            "picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_a8d2ec85eaf98407310b72eb73dda2474-760x500.jpg",
            "url": "http://m.xxxiao.com/419"
        }
    ]
}




接下来就要解析出需要的数据,下面另起了HttpJson线程,在构造方法中传入了四个参数,并将parseJson方法返回的带有10个对象的pictureList添加到adapter中。
import android.os.Handler;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;

public class HttpJson extends Thread {
    private List pictureList = new ArrayList<>();
    private ListView listView;
    private MyJsonAdapter adapter;
    private Handler handler;
    private String jsonData;

    /**
     * @param listView 用于显示数据的list
     * @param adapter 为listview自定义的适配器
     * @param handler 更新UI
     * @param jsonData Json数据
     */
    public HttpJson(ListView listView, MyJsonAdapter adapter, Handler handler, String jsonData) {
        this.listView = listView;
        this.adapter = adapter;
        this.handler = handler;
        this.jsonData = jsonData;
    }

    @Override
    public void run() {
        pictureList = parseJson(jsonData);
        handler.post(new Runnable() {
            @Override
            public void run() {
                //数据适配器中添加数据
                adapter.addData(pictureList);
                //ListView指定数据适配器
                listView.setAdapter(adapter);
            }
        });
    }

    /**
     * 获取Json数据中的List集合
     */
    private List parseJson(String jsonData) {

        try {
            //将数据转换为JSONObject
            JSONObject jsonObject = new JSONObject(jsonData);
            //通过JSONObject将JSONArray中的数组(newlist)解析出来
            JSONArray jsonArray = jsonObject.getJSONArray("newslist");

            for (int i = 0; i < jsonArray.length(); i++) {
                //再将jsonArray中每组中的数据(含有title,picUrl,url等)转换为jsonObject
                JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                //实例化BeautifulGirlsPicture并利用jsonObject为其各变量赋值
                BeautifulGirlsPicture bgPicture = new BeautifulGirlsPicture();
                bgPicture.setTitle(jsonObject1.getString("title"));
                bgPicture.setDescription(jsonObject1.getString("description"));
                bgPicture.setPicUrl(jsonObject1.getString("picUrl"));
                bgPicture.setUrl(jsonObject1.getString("url"));
                pictureList.add(bgPicture);
            }
            return pictureList;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}
自定义Adapter
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class MyJsonAdapter extends BaseAdapter {
    private List list;
    private LayoutInflater inflator;
    private Handler handler = new Handler();
    private Context context;

    public MyJsonAdapter(Context context) {
        this.context = context;
        inflator = LayoutInflater.from(context);
    }

    public void addData(List data) {
        this.list = data;
    }

    @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(int i, View convertView, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflator.inflate(R.layout.list_item, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        BeautifulGirlsPicture beautifulGirlsPicture = list.get(i);
        viewHolder.title.setText(beautifulGirlsPicture.getTitle());
        viewHolder.description.setText(beautifulGirlsPicture.getDescription());
        viewHolder.url.setText(beautifulGirlsPicture.getUrl());
        new HttpImage(beautifulGirlsPicture.getPicUrl(), handler, viewHolder.imageView).start();
        return convertView;
    }

    class ViewHolder {
        private ImageView imageView;
        private TextView title;
        private TextView description;
        private TextView url;

        public ViewHolder(View view) {
            title = (TextView) view.findViewById(R.id.id_tv_title);
            description = (TextView) view.findViewById(R.id.id_tv_des);
            imageView = (ImageView) view.findViewById(R.id.id_iv);
            url= (TextView) view.findViewById(R.id.id_tv_time);
        }
    }
}

通过Url加载图片

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

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


public class LoadImage extends Thread {
    private ImageView imageView;
    private Handler handler;
    private String url;

    public LoadImage(String url, Handler handler, ImageView imageView) {
        this.url = url;
        this.handler = handler;
        this.imageView = imageView;
    }
    @Override
    public void run() {
        try {
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setReadTimeout(5000);
            connection.setRequestMethod("GET");
            InputStream inputStream = connection.getInputStream();
            final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            handler.post(new Runnable() {
                @Override
                public void run() {
                    imageView.setImageBitmap(bitmap);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}







你可能感兴趣的:(利用百度APIStoreSDK获取Json数据并解析加载到ListView上)