展会信息港展会大全

android开发用异步任务解决新线程不能更新UI组件的问题
来源:互联网   发布日期:2016-01-19 12:32:55   浏览:1795次  

导读:Android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕触屏绘图事件等,因此开发者的其他操作不应该、也不能阻塞UI线程,不要在UI线程执行一些耗时操作。AsyncTask是一个抽象类,通常用于被继承,继 ...

Android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕触屏绘图事件等,因此开发者的其他操作不应该、也不能阻塞UI线程,不要在UI线程执行一些耗时操作。

AsyncTask<>是一个抽象类,通常用于被继承,继承AsyncTask时需要指定如下三个泛型参数。

AsyncTask是抽象类,它定义了如下三种类型:

1、Params:启动任务执行的输入参数的类型;

2、Progress:后台任务完成的进度值的类型;

3、Result:后台执行任务完成后返回值的类型。

使用AstncTask只要如下三步即可:

1、创建AsyncTask的子类,并为三个泛型参数指定类型,如果某个泛型不需要指定类型,可以指定为void.

2、根据需要,实现AsyncTask的提供的方法。

3、调用AsyncTask子类实例的execute(Params... params)开始执行耗时任务。

代码

```package com.example.asynctasktest;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;

import android.os.AsyncTask;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

import android.app.Activity;

import android.app.ProgressDialog;

import android.content.Context;

public class MainActivity extends Activity {

private TextView show;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

show = (TextView) findViewById(R.id.main_text);

}

public void download(View source) throws MalformedURLException{

DownTask task = new DownTask(this);

task.execute(new URL("http://www.crazyit.org/ethos.php"));

}

class DownTask extends AsyncTask<URL, Integer, String>{

ProgressDialog pdialog;

int hasRead = 0;

Context mContext;

public DownTask(Context ctx){

mContext = ctx;

}

//后台线程将要完成的任务

@Override

protected String doInBackground(URL... params) {

StringBuilder sb = new StringBuilder();

try {

//网络连接

URLConnection conn = params[0].openConnection();

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));

String line = null;

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

sb.append(line + "n");

hasRead++;

//调用该方法就会触动onProgressUpdate()方法

publishProgress(hasRead);

}

return sb.toString();

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

//当doInBackground()运行结束时,将返回值传递给该方法

@Override

protected void onPostExecute(String result) {

show.setText(result);

pdialog.dismiss();

}

//在执行耗时操作时调用

@Override

protected void onPreExecute() {

pdialog = new ProgressDialog(mContext);

//设置对话框的标题

pdialog.setTitle("任务正在执行中");

//设置对话框显示的内容

pdialog.setMessage("任务正在执行中,敬请等待...");

//设置对话框不能用取消按钮关闭

pdialog.setCancelable(false);

//设置进度条的最大进度值

pdialog.setMax(202);

//设置对话框的进度条风格

pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

//设置对话框的进度条是否显示进度

pdialog.setIndeterminate(false);

pdialog.show();

}

@Override

protected void onProgressUpdate(Integer... values) {

//更新进度

show.setText("已经读取了【" + values[0] + "】行!");

pdialog.setProgress(values[0]);

}

}

}

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港