一.目的
从服务器上获取数据库里表格的每条信息,并在app中以列表表示,点击每条记录,可以出现详细信息
二.步骤
1.控件布局设计,添加一个ListView控件
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/my_list_view">
2.在activities中定义控件,并在随后的代码(后面的步骤)通过id找到该控件
ListView my_list_view;
3.在onCreate方法中新定义一个线程
new Thread(new Runnable() {
@Override
public void run() {
//这里的代码参照第六步
}
}).start();
4.在线程里重写的run方法体里,
1)定义一个字符串用来存放要访问的服务器程序地址,并将服务器程序的路径传入url类型的对象中
String urlStr = "http://2k4154032o.qicp.vip:59770/MyServlet" + "/DaiBanShiJian";
URL url = new URL(urlStr);
2)新建一个连接对象
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
3)设置连接对象相关参数
connection.setRequestMethod("POST");
//允许读取和连接最长时间为5秒
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
//允许输入输出
connection.setDoInput(true);
connection.setDoOutput(true);
//设置本次连接是否自动处理重定向。
//设置成true,系统自动处理重定向;设置成false,则需要自己从http reply中分析新的url
//自己重新连接。
connection.setInstanceFollowRedirects(true);
4)定义一个可变字符串用来保存从服务器上传来的数据
StringBuilder sb = new StringBuilder();
5)判断是否连接成功,如果成功,就使用一个BufferedReader保存从服务器上传来的字符(经过InputStreamReader把字节流转为字符流)
if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
//如果连接上服务器端,客户端程序使用BufferedReader读取connection传来的数据
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
//在这里如果改为字符串数组的话,得知道数组长度
String temp;
//如果传入的数据不为空,则可变字符串添加该数据
while((temp = reader.readLine()) != null){
sb.append(temp);
break;
}
reader.close();
}else{
// return "connection error:" + connection.getResponseCode();
}
connection.disconnect();
}catch (Exception e){
// return e.toString();
}
6)断开连接
connection.disconnect();
7)定义一个字符串用来将可变字符串保存为字符串
String result= sb;
8)定义消息,并往消息里封装结果字符串,然后将消息发送到主线程
Message msg = new Message();
//指定message 的id
msg.what = 0x13;
//Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的。
Bundle data = new Bundle();
data.putString("result", result);
//mes利用Bundle传递数据
msg.setData(data);
//发送信息到主线程
hander.sendMessage(msg);
9)在run方法之外定义一个handler对象,并重写处理消息的方法
Handler hander = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x10) {
- 在第九步重写的方法里,对传来的方法进行解析,并同意保存到一个字符串中
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
11)将结果字符串用逗号分割,放在一个列表中
List<String> gameids = java.util.Arrays.asList(key.split(","));
12)创建一个list集合 用来打包存放数据源,适配器需要这种格式的数据
List<Map<String, Object>>
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
13)往List<Map<String, Object>>对象添加数据
for (int i = 0; i < gameids.size(); i++) {
Map<String, Object> map = new HashMap<String, Object>(); // 实例化Map对象
map.put("data1", gameids.get(i));
listItems.add(map); // 将map对象添加到List集合中
}
14)创建适配器
SimpleAdapter adapter = new SimpleAdapter(DaiBanShiJian.this, listItems,
R.layout.main, new String[] { "data1"}, new int[] {
R.id.title }); // 创建SimpleAdapter
15)通过id获取列表视图,并给它对应的适配器
ListView listview = (ListView) findViewById(R.id.my_list_view); // 获取列表视图
listview.setAdapter(adapter); // 将适配器与ListView关联
16)设置listview的单击事件
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Map<String, Object> map = (Map<String, Object>) parent.getItemAtPosition(position); //获取选择项的值
Toast.makeText(DaiBanShiJian.this, map.get("data1").toString(), Toast.LENGTH_SHORT).show();
}
});