您的位置:首页 > Web前端 > JavaScript

Handler应用(一):从服务器端加载JSON数据

2014-01-06 23:28 483 查看

最终目的

以JSON的形式,将数据存入服务器端。
在Android中,以Handler加载显示大批量文字。
在此以加载金庸小说《天龙八部(新修版)》为例(2580480 字节)。

以tomcat为服务器,在jsp中以I/O读取本机上的txt文件,写入JSON数据。

在加载过程中,以进度条的形式提示用户需要等待。
加载完成后,进度条消失,并显示加载内容。

Activity文件

[java] view plaincopy

package com.app.test02;

import java.util.Map;

import com.app.util.MyApplication;

import android.app.Activity;

import android.opengl.Visibility;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.widget.Button;

import android.widget.ProgressBar;

import android.widget.TextView;

public class HanderTest_Text extends Activity {

private Button button;

private TextView textView;

private Handler handler;

private ProgressBar progressBar;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_hander_text);

button = (Button) findViewById(R.id.button1);

textView = (TextView) findViewById(R.id.textView1);

progressBar = (ProgressBar) findViewById(R.id.progressBar1);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

progressBar.setVisibility(View.VISIBLE);

button.setText("加载中...");

new MyThread().start();

}

});

handler = new Handler(){

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

textView.setText(msg.obj.toString());

progressBar.setVisibility(View.GONE);

button.setText("加载完成");

button.setEnabled(false);

}

};

}

class MyThread extends Thread{

@Override

public void run() {

// TODO Auto-generated method stub

String result = ApplicationDemo.handleGet("http://10.0.2.2:8888/android/");

Map map = ApplicationDemo.getMap(result);

Message message = handler.obtainMessage();

message.obj = map.get("book");

try {

sleep(30000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

handler.sendMessage(message);

}

}

}

XML布局文件

activity_hander_text.xml

[html] view plaincopy

<?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"

android:background="#fff" >

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

android:gravity="center">

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="加载文本" />

</LinearLayout>

<ScrollView

android:id="@+id/scrollView1"

android:layout_width="match_parent"

android:layout_height="wrap_content" >

<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<TextView

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=""

android:textColor="#000"/>

</LinearLayout>

</ScrollView>

<ProgressBar

android:id="@+id/progressBar1"

style="?android:attr/progressBarStyleLarge"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:visibility="gone" />

</LinearLayout>

ApplicationDemo

[java] view plaincopy

package com.app.util;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import org.apache.http.HttpResponse;

import org.apache.http.HttpStatus;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

import org.json.JSONException;

import org.json.JSONObject;

import android.app.Application;

public class ApplicationDemo extends Application {

/** 发送GET请求并获取服务器端返回值 */

public static String handleGet(String strUrl) {

String result = null;

HttpGet request = new HttpGet(strUrl);//实例化get请求

DefaultHttpClient client = new DefaultHttpClient();//实例化客户端

try {

HttpResponse response = client.execute(request);//执行该请求,得到服务器端的响应内容

if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

result = EntityUtils.toString(response.getEntity());//把响应结果转成String

} else {

result = response.getStatusLine().toString();

}

} catch (Exception e) {

return e.getMessage();

}

return result;

}

/** 将JSON字符串转换为Map */

public static Map<String, Object> getMap(String jsonString) {

JSONObject jsonObject;

try {

jsonObject = new JSONObject(jsonString);

@SuppressWarnings("unchecked")

Iterator<String> keyIter = jsonObject.keys();

String key;

Object value;

Map<String, Object> valueMap = new HashMap<String, Object>();

while (keyIter.hasNext()) {

key = keyIter.next();

value = jsonObject.get(key);

valueMap.put(key, value);

}

return valueMap;

} catch (JSONException e) {

e.printStackTrace();

}

return null;

}

}

服务器端

在tomcat的\webapps文件夹下新建android文件夹,在其中新建一个index.jsp,用来存放服务器端的JSON数据。



index.jsp:

[java] view plaincopy

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" import="java.util.*" import="java.io.*"%>

<%

response.setContentType("text/html;charset=utf-8");

%>

<%

BufferedReader bReader = null;

String line = null;

StringBuffer buffer = new StringBuffer();

try {

// bReader =new BufferedReader(new FileReader(new File("D:\\Program File\\apache-tomcat-7.0.20\\webapps\\android\\index.jsp")));

bReader =new BufferedReader(new FileReader(new File("E:\\文字\\金庸\\TXT\\新修版\\天龙八部(新修版).txt")));

while ((line = bReader.readLine())!=null) {

buffer.append(line).append("\n");

}

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

out.print("{\"book\":\"" + buffer.toString() + "\"}");

%>

完成后,打开tomcat服务器,在浏览器中输入路径,尝试访问该JSP文件。



如能访问则说明服务器端没问题。

加入权限

由于要访问服务器网络,所以,必须在AndroidManifest.xml中加入网络访问权限:

[html] view plaincopy

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

最终效果

加载前



加载过程中



加载完成后

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: