• 【Android】Handler的应用(一):从服务器端加载JSON数据


    最终目的

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

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

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

    Activity文件

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

    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:
    <%@ 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("
    ");  
    		}  
    	} catch (Exception e) {  
    		// TODO: handle exception  
    		e.printStackTrace();  
    	} 
    	out.print("{"book":"" + buffer.toString() + ""}");
    	
    %>

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


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

    加入权限

    由于要访问服务器网络,所以,必须在AndroidManifest.xml中加入网络访问权限:
    <uses-permission android:name="android.permission.INTERNET"/>

    最终效果

    加载前



    加载过程中



    加载完成后


  • 相关阅读:
    苹果开发者账号多少钱?个人/公司/企业申请费用及怎么选【都有】
    uniapp ios真机调试【亲测有效】
    Uniapp---IOS打包证书私钥密码怎么获取?
    微信小程序地图计算两个点之间的距离
    各大地理坐标系互转
    解决mac下vscode等应用中vim光标无法快速移动
    python 脚本如何在后代运行并记录标准输出
    wkhtmltox 在Linux上安装
    shell中的##*,%%*问题
    matplotlib、seaborn 展示中文字体
  • 原文地址:https://www.cnblogs.com/riasky/p/3360894.html
Copyright © 2020-2023  润新知