您的位置:首页 > 理论基础 > 计算机网络

一个完整的Android ListView+网络接口读取+JSON处理的Demo

2014-02-24 09:23 423 查看
我坚信一个比较完善的项目,能比较完善的测试一把需要使用到的技术点,才能学得更快。不能直接去练习每个控件的用法,太枯燥了。

eoeschool的学习进度:

http://www.eoeschool.com/course/show/id/26.html

78课时,完整看完前面18课时以及常用控件的一半课时,SQLite课时。了解了四大组件,几种布局方式,几个控件以后,我觉得可以开始自己写代码了。

所以准备完成一个完整的Android ListView+网络接口读取+JSON处理的Demo。

这个需求,测试了Android开发过程中,使用频率最高的ListView控件,也使用到了网络通信读取远程Api的通信过程。

目前来看,JSON已经成了各类语言间交换数据的标准,我会比较刁钻一点,非要选择一个FastJSON来学习导入第三方库的过程。

首先,我找到了FastJSON针对Android优化的版本。

fastjson有专门的for android版本,去掉不常用的功能。jar占的字节数更小:

http://sourceforge.net/projects/fastjson/files/

更多关于FastJSON的内容可以看他们的WIKI:

https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

今天上手调试了一把,发现jsonObject也挺好用的,先就用了FastJson了。

为了方便,我把所有过程写到了主文件中。受MainActivity中不能直接访问网络,还得去拜读一下ice的文章:

http://my.eoe.cn/iceskysl/archive/4382.html

网络测试使用的接口是:

http://api.eoe.cn/client/blog?k=lists&t=top

效果如下:



代码如下:

1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152


package cn.eoe.shuhai.eoethread;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

import org.apache.http.util.ByteArrayBuffer;
import org.apache.http.util.EncodingUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private ListView lv = null;
    private TextView tv = null;
    private ArrayList<String> lvList = new ArrayList<String>();
    private String more_url = null;
    private String urlContent = null;

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

        new Thread(runnable).start();

        tv = (TextView) findViewById(R.id.tv);
        tv.setText(" loading...");
    }

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle data = msg.getData();
            String content = data.getString("content");

            //尝试读取第二个页面的页面
            urlContent = url_get_content(more_url);

            //给一个弹出层拽一把
            Toast toast = Toast.makeText(getApplicationContext(), more_url, Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);//居中显示
            toast.show();

            //准备一个list用来存放json数组中的数据
            lvList = json_decode(content);

            //将数组通过 adapter传递给控件
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
                    android.R.layout.simple_dropdown_item_1line,
                    lvList);

            //隐藏默认的提示内容
            tv.setHeight(0);

            //ListView加载刚刚的List
            lv = (ListView) findViewById(R.id.lv);
            lv.setAdapter(adapter);

        }
    };

    Runnable runnable = new Runnable() {
        @Override
        public void run()
        {
            more_url = more_url != null ? more_url : "http://api.eoe.cn/client/blog?k=lists&t=top";
            urlContent = url_get_content(more_url);

            Message msg = new Message();
            Bundle data = new Bundle();
            data.putString("content", urlContent);
            msg.setData(data);
            handler.sendMessage(msg);
        }
    };

    public static String url_get_content(String url) {
        String myString = null;
        try {
            // 定义获取文件内容的URL
            URL myURL = new URL(url);
            // 打开URL链接
            URLConnection ucon = myURL.openConnection();
            // 使用InputStream,从URLConnection读取数据
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            // 用ByteArrayBuffer缓存
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while ((current = bis.read()) != -1) {
                baf.append((byte) current);
            }
            // 将缓存的内容转化为String,用UTF-8编码
            myString = EncodingUtils.getString(baf.toByteArray(), "UTF-8");
        } catch (Exception e) {
            // myString = e.getMessage();
            myString = null;
        }

        return myString;
    }

    /**
     * 格式化json的结果,只取items的数组
     * @param content
     * @return
     */
    public ArrayList<String> json_decode(String content)
    {
        //准备一个list用来存放json数组中的数据
        if(lvList == null)
        {
            ArrayList<String> lvList = new ArrayList<String>();
        }

        try {
            JSONObject josnObject = new JSONObject(content);
            JSONArray array = josnObject.getJSONObject("response").getJSONArray("items");

            //获取分页url
            more_url = josnObject.getJSONObject("response").getString("more_url");

            int length = array.length();

            for (int i = 0; i < length; i++) {
                JSONObject object = array.getJSONObject(i);
                lvList.add(object.getString("title").toString());
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

        return lvList;
    }
}


明天的计划是:

做一个滑动分页加载接口的更多内容
Item尝试使用左右滑动添加删除和查看详情的功能

转自:http://my.eoe.cn/shuhai/archive/19604.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: