文档章节

异步加载数据的三种实现

SuShine
 SuShine
发布于 2015/06/25 15:28
字数 960
阅读 12
收藏 0
点赞 0
评论 0
package com.testasyntextview;
/**
 * 把获取的线程写到方法中(比较好)
 */
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MethodTestAsynTextViewActivity extends Activity {
	private TextView textView1;
	private Button button1;
	private Context context;
	private ProgressDialog progressDialog;
	private Spanned html;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		context = this;
		textView1 = (TextView) findViewById(R.id.textView1);
		button1 = (Button) findViewById(R.id.button1);
		button1.setOnClickListener(l);

	}

	private OnClickListener l = new OnClickListener() {

		@Override
		public void onClick(View v) {

			progressDialog = ProgressDialog.show(context, "获取数据中", "等待");
			getHtmlDate();

		}
	};

	private void getHtmlDate() {// 获取数据,把线程写入了其中
		new Thread() {
			public void run() {
				Message msg = myHandler.obtainMessage();
				try {
					html = HttpUtil.fromHtml(HttpUtil
							.getHtml("http://wap.sina.com"));
					msg.what = 0;
				} catch (Exception e) {
					e.printStackTrace();
					msg.what = 1;
				}

				myHandler.sendMessage(msg);
			}
		}.start();
	}

	Handler myHandler = new Handler() {

		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				textView1.setText(html);
				progressDialog.dismiss();
				break;
			case 1:
				textView1.setText("当前无数据");
				progressDialog.dismiss();
				break;
			}
			super.handleMessage(msg);
		}
	};

}
package com.testasyntextview;

/**
 * 使用AsyncTask类
 */
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
import android.text.Spanned;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TestAsynTextViewActivity extends Activity {
	private TextView textView1;
	private Button button1;
	private Context context;
	private ProgressDialog progressDialog;
	private Spanned html;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		context = this;

		progressDialog = new ProgressDialog(context);
		progressDialog.setTitle("进度条");
		progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

		textView1 = (TextView) findViewById(R.id.textView1);
		button1 = (Button) findViewById(R.id.button1);
		button1.setOnClickListener(l);

	}

	private OnClickListener l = new OnClickListener() {

		@Override
		public void onClick(View v) {
			new InitTask().execute("http://wap.sina.com",
					"http://wap.baidu.com");

		}
	};

	private void getHtmlDate(String url) {// 获取数据,把线程写入了其中

		try {
			html = HttpUtil.fromHtml(HttpUtil.getHtml(url));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * When an asynchronous task is executed, the task goes through 4 steps:
	 * 
	 * onPreExecute(), 
	 * invoked on the UI thread immediately after the task is
	 * executed. This step is normally used to setup the task, for instance by
	 * showing a progress bar in the user interface. 
	 * 
	 * doInBackground(Params...),
	 * invoked on the background thread immediately after onPreExecute()
	 * finishes executing. This step is used to perform background computation
	 * that can take a long time. The parameters of the asynchronous task are
	 * passed to this step. The result of the computation must be returned by
	 * this step and will be passed back to the last step. This step can also
	 * use 
	 * 
	 * publishProgress(Progress...) to publish one or more units of
	 * progress. These values are published on the UI thread, in the
	 * 
	 * onProgressUpdate(Progress...) step. onProgressUpdate(Progress...),
	 * invoked on the UI thread after a call to publishProgress(Progress...).
	 * The timing of the execution is undefined. This method is used to display
	 * any form of progress in the user interface while the background
	 * computation is still executing. For instance, it can be used to animate a
	 * progress bar or show logs in a text field. onPostExecute(Result), invoked
	 * on the UI thread after the background computation finishes. The result of
	 * the background computation is passed to this step as a parameter.
	 */

	class InitTask extends AsyncTask<String, Integer, Long> {
		protected void onPreExecute() {
			progressDialog.show();
			super.onPreExecute();

		}

		protected Long doInBackground(String... params) {// Long是结果 String 是入口参数

			getHtmlDate(params[0]);// 可以运行两个任务
			publishProgress(50);// 发送进度50%
			getHtmlDate(params[1]);
			publishProgress(100);// 发送进度100%

			return (long) 1;

		}

		@Override
		protected void onProgressUpdate(Integer... progress) {

			progressDialog.setProgress(progress[0]);// 设置进度
			super.onProgressUpdate(progress);
			Log.e("测试", progress[0] + "");

		}

		@Override
		protected void onPostExecute(Long result) {

			setTitle(result + "测试");
			textView1.setText(html);
			progressDialog.dismiss();

			super.onPostExecute(result);

		}

	}

}

package com.testasyntextview;
/**
 * 使用Runable
 */
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class RunableTestAsynTextViewActivity extends Activity {
	private TextView textView1;
	private Button button1;
	private Context context;
	private ProgressDialog progressDialog;
	private Spanned html;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		context = this;
		textView1 = (TextView) findViewById(R.id.textView1);
		button1 = (Button) findViewById(R.id.button1);
		button1.setOnClickListener(l);

	}

	private OnClickListener l = new OnClickListener() {

		@Override
		public void onClick(View v) {

			progressDialog = ProgressDialog.show(context, "获取数据中", "等待");
			new Thread(new ThreadDemo()).start();

		}
	};

	private void getHtmlDate() {
		try {
			html = HttpUtil.fromHtml(HttpUtil.getHtml("http://wap.sina.com"));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	class ThreadDemo implements Runnable {//一个runable
		public void run() {
			getHtmlDate();
			myHandler.sendEmptyMessage(0);
		}
	}

	Handler myHandler = new Handler() {

		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				textView1.setText(html);
				progressDialog.dismiss();
				break;
			case 1:
				textView1.setText("当前无数据");
				progressDialog.dismiss();
				break;
			}
			super.handleMessage(msg);
		}
	};

}
package com.testasyntextview;

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

import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.Spanned;

public class HttpUtil {
	public static String getHtml(String path) throws Exception {
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5 * 1000);
		InputStream inStream = conn.getInputStream();// 通过输入流获取html数据
		byte[] data = readInputStream(inStream);// 得到html的二进制数据
		String html = new String(data, "utf-8");
		return html;
	}

	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		inStream.close();
		return outStream.toByteArray();
	}

	public static Spanned fromHtml(String html) {
		Spanned sp = Html.fromHtml(html, new Html.ImageGetter() {
			@Override
			public Drawable getDrawable(String source) {
				InputStream is = null;
				try {
					is = (InputStream) new URL(source).getContent();
					Drawable d = Drawable.createFromStream(is, "src");
					d.setBounds(0, 0, d.getIntrinsicWidth(),
							d.getIntrinsicHeight());
					is.close();
					return d;
				} catch (Exception e) {
					return null;
				}
			}
		}, null);
		return sp;

	}
}



© 著作权归作者所有

共有 人打赏支持
SuShine
粉丝 118
博文 435
码字总数 88625
作品 0
青岛
后端工程师
Extjs 蒙板效果实现

Extjs 蒙板效果实现 在以下情况可能会用的蒙板效果: 1、在数据提交时,我们一般是不希望用户再去执行其他的操作 2、在数据加载时,提示用户正在加载 3、在处理复杂操作时,提交响应速度有点...

Junn ⋅ 2013/09/02 ⋅ 1

Jquery工作常用实例——使用$.post,$.get,$.ajax使网页进行异步更新

AJAX = Asynchronous JavaScript and XML.,是一种创建快速动态网页的技术。 AJAX 通过在后台与服务器交换少量数据的方式,允许网页进行异步更新。这意味着有可能在不重载整个页面的情况下,...

Adam-Lee ⋅ 2011/07/16 ⋅ 1

Android Loader 机制,让你的数据加载更加高效

前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1、Thread + Handler Th...

developerHaoz ⋅ 2017/11/27 ⋅ 0

开源中国Android客户端-使用Tab切换Fragment

一、简述 在开源中国客户端中,使用了大量的列表去加载新闻、咨询、博客等等内容,而根据合理的分类,又可以使得这些列表显示的样式保持一致。 说明: 1)、可以左右滑动切换,更方便。 2)、左...

Xushao ⋅ 2013/07/04 ⋅ 2

Android 异步加载解决方案

Android的Lazy Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍Android开发过程中,异步处理这个常见的技术问题之前,...

Pandora ⋅ 2012/08/14 ⋅ 1

JS动态加载脚本及对动态脚本内方法的调用

首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在里面写一个方法functionOne,很简单,代码如下: function functionOne(){ alert("成功加载");} 后面的...

恐空控 ⋅ 2014/02/24 ⋅ 0

java做的电子商务网站,首页数据用什么方式加载效率更快。

struts+spring+ibatis+velocity做的电子商务网站,网站首页数据大都是动态读取数据库,用什么方式读取会快一点。 1通常页面取值是循环作用域里的List; 2ajax异步获取数据; 3页面上直接调用读...

zkool ⋅ 2012/10/22 ⋅ 8

Javascript 全栈开发框架--EggBorn.js

EggBorn.js 是什么 EggBorn.js是一款顶级Javascript全栈开发框架。 EggBorn.js是采用Javascript进行全栈开发的最佳实践。 EggBorn.js不重复造轮子,而是采用业界最新的开源技术,进行全栈开发...

zhennann ⋅ 2017/10/25 ⋅ 0

blackfox/ajaxUpload

AjaxUpload @author:yangjian102621@gmail.com 插件描述: javascript异步上传插件,包含3个子项目BUpload, JUpload, TUpload. BUpload : 基于HTML5, UI仿百度编辑器的图片上传, 支持图片上...

blackfox ⋅ 2016/06/05 ⋅ 0

Ajax.ActionLink()方法的使用

第一句话都会这么去写:程序猿就是苦逼,除了开发还要会写博文!哎,今天就和大家一起讨论下Ajax的辅助方法ActionLink的使用,如果有讲的不好的地方或错的地方,请大家务必扔板砖,要投准哦,...

天才小龙 ⋅ 01/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 28分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 47分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 56分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部