1.onResume()完全执行结束了(没有阻塞)的时候才会 在手机上面显示界面。
2.不能在UI thread执行耗时操作 否则ANR ,handler.post或者postDelay并没有启动新线程,只是不阻塞了而已
3.不能在非UI thread操作 UI 控件,需要使用handler
4.使用Thread+Message+Handler解决上述问题
package handler.activity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
static final int DOWNSUCCESS = 1;
static final int DOWNFAIL = 0;
ProgressDialog dialog = null;
private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// //执行接收到的通知,更新UI 此时执行的顺序是按照队列进行,即先进先出
super.handleMessage(msg);
switch (msg.what) {
case DOWNSUCCESS:
dialog.dismiss();
Toast.makeText(MainActivity.this, "下载成功", Toast.LENGTH_SHORT)
.show();
break;
}
}
};
// *****************************************
// 主线程Handler负责更新UI,Handler与 Thread通过Message通信
private Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
// 耗时操作
SystemClock.sleep(2000);
Message msg = new Message();
msg.what = DOWNSUCCESS;
MainActivity.this.myHandler.sendMessage(msg);
}
});
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) this.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
myThread.start();
dialog = ProgressDialog.show(MainActivity.this, "",
"Loading. Please wait...", true);
}
});
}
}
==================================================================================
5.HandlerThread Looper MessageQueue三者之间的关系
HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。
这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。
Android中每一个线程都跟着一个Looper,Looper可以帮助线程维护一个消息队列,Looper对象的执行需要初始化Looper.prepare方法,
使用Looper.loop方法启动消息队列管理机制,退出时还要使用Looper.release方法释放资源
关于Looper Handler Message的原理 与 线程局部变量 请参考这篇文章
http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
===============================================================
6.AsyncTask
package androidthread.acitvity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btn = null;
private EditText etaddrss = null;
private EditText etcontent =null;
private ProgressBar pb =null;
private ProgressDialog dialog =null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) this.findViewById(R.id.btnsend);
etaddrss = (EditText) this.findViewById(R.id.etaddress);
etcontent = (EditText) this.findViewById(R.id.etcontent);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new MyThreads().execute(etaddrss.getText().toString(),etcontent.getText().toString());
}});
}
//一般作为内部类使用
public class MyThreads extends AsyncTask<String,Integer , String>{
int i=0;
@Override
//这里的参数 与 execute 中的相对应
//这个方法不在UI线程(主线程)不能访问UI组件
protected String doInBackground(String... arg) {
//arg[0]+arg[1];
while(i<=100){
//模拟耗时操作
SystemClock.sleep(500);
this.publishProgress(i);
i+=10;
}
return "发送给"+arg[0]+"内容为"+arg[1]+"邮件已成功发送";
}
@Override //参数reslut 是doInBackground()的返回值
protected void onPostExecute(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
dialog.dismiss();
pb.setVisibility(View.INVISIBLE);
}
@Override
protected void onPreExecute() {
Toast.makeText(MainActivity.this, "开始发送邮件", Toast.LENGTH_SHORT).show();
dialog = ProgressDialog.show(MainActivity.this, "",
"Loading. Please wait...", true);
pb =new ProgressBar(MainActivity.this,null,android.R.attr.progressBarStyleHorizontal);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(200,20);
params.setMargins(10, 10, 0, 0);
pb.setLayoutParams(params);
pb.setMax(100);// 设置最大值
pb.setProgress(0);
pb.setVisibility(View.VISIBLE);
MainActivity.this.addContentView(pb, params);
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... process) {
Log.i("process",process[0].intValue() +"");
pb.setProgress(process[0].intValue() );
super.onProgressUpdate(process);
}
}
}
分享到:
相关推荐
Android多线程PPT教学课件.pptx
Android 多线程开发实例,对使用多线程的用户有一定的参考价值!
Android开发中的多线程编程技术资源包 TAG:Android 多线程 应用开发 Alfred整理发布,版权所有!
android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。
Android开发(个人整理01) 都是个人测试过的,线程Demo源码
不错的android多线程开发技术文档,全面讲解。值得一看
使用eclipse实现Android多线程下的简单字符串计数器
Android系列课程第二季:多线程使用方法和高级技巧——深入理解 快速掌握Android开发技术、快速提高,全面掌握Android技术体系,同时对Android中常用的技术以及重点难点能够深入理解、熟练运用。
Android多线程处理[参考].pdf
本文章介绍Android多线程编程方法及开启步骤。
通过一个Android多线程下载的小例子,可以让初学者轻松掌握Android多线程下载应用的开发
android多线程断点续传下载源代码,有需要的朋友可以下载
《Android多线程断点续传下载网络上的音/视频等各种文件》多线程,断点续传,各种网络上的数据,下载网络上的数据时基本功!加油了各位!
介绍四种Android开发多线程的操作方式
可以动态设置线程个数,用于android初学者多线程断点下载参考使用,资源为源码包
多线程下载:1、创建URL对象; 2、获取指定URL对象所指向资源的大小; 3、在本地磁盘上创建一个与网络资源相同大小的空文件; 4、计算每条线程应该下载网络资源的哪个部分; 5、依次创建、启动多线程来下载网络资源...
Android应用源码开发Demo,主要用于毕业设计学习。
Android多线程的一个示例代码,方便用户快速进行Andorid多线程开发
安卓开发之Android多线程编程.md