Android中的线程
2015-11-21 10:53
405 查看
在UI线程中不允许存在阻断的当有需要耗时操作的时候需要另起一个新的线程。例如简单的一个例子:
在页面出现一个圆圈进度条,他是执行一个耗时操作的任务,在这里对其进行睡眠达到这个效果。则需要一个新的子线程来执行这个操作:
PopupWindow pop;
ProgressDialog pd;
//进度框的显示
public void pdshow(){
pd = new ProgressDialog(this);
pd.setTitle("消息框");
pd.setMessage("请稍后。。。");
pd.setCancelable(true);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.show();
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
//关闭进度条
pd.dismiss();
}
};
public void btonclick(View v){
//调用显示进度条的方法
pdshow();
//新建立一个子线程让其在三秒之后把刚才打开的进度条关闭
new Thread(){
@Override
public void run() {
super.run();
for(int i=0; i<3; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(0);
}
}.start();
/*LayoutInflater inflater = LayoutInflater.from(this);
View myview = inflater.inflate(R.layout.layout_my_dialog, null);
//AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setView(myview);
pop = new PopupWindow(myview, 600, 500);
myview.findViewById(R.id.bt_02).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(MainActivity2.this, "点击了确定", Toast.LENGTH_SHORT).show();
pop.dismiss();
}
});
//pop.showAsDropDown(v);
pop.showAtLocation(v, Gravity.CENTER, 0, 0);*/
//dialog = builder.create();
//dialog.show();
//builder.show();
}如果把圆圈的进度条转化为长的进度条时:
PopupWindow pop;
ProgressDialog pd;
public void pdshow(){
pd = new ProgressDialog(this);
pd.setTitle("消息框");
pd.setMessage("请稍后。。。");
pd.setCancelable(true);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(10); //最终需要完成的量
pd.show();
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg); 需要根据不同的message判断应该怎么处理
if(msg.what == 0){
pd.dismiss();
} else {
pd.setProgress(msg.arg1);
}
}
};
public void btonclick(View v){
pdshow();
new Thread(){
@Override
public void run() {
super.run();
for(int i=1; i<11; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//不在进行发送空消息 而是发送包含message的消息以进行判断
Message msg = Message.obtain();
msg.arg1 = i;
msg.what = 1;
handler.sendMessage(msg);
}
handler.sendEmptyMessage(0);
}
}.start();
/*LayoutInflater inflater = LayoutInflater.from(this);
View myview = inflater.inflate(R.layout.layout_my_dialog, null);
//AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setView(myview);
pop = new PopupWindow(myview, 600, 500);
myview.findViewById(R.id.bt_02).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(MainActivity2.this, "点击了确定", Toast.LENGTH_SHORT).show();
pop.dismiss();
}
});
//pop.showAsDropDown(v);
pop.showAtLocation(v, Gravity.CENTER, 0, 0);*/
//dialog = builder.create();
//dialog.show();
//builder.show();
}在这顺便说一下 当退出一个程序的时候,需求是需要按两次退出时才退出:
实现代码:
private long mExitTime;
@Override
public void onBackPressed() {
//super.onBackPressed();
/*new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("确认对话框")
.setMessage("您真的要退出程序么?")
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).show();*/
//在第一次点击退出的时候mExitTime默认是为0的所以一开始两个的差值必然是大于2分钟的 然后取当前按下的时间给mExtiTime进行赋值再进行差值判断
if((System.currentTimeMillis()-mExitTime) > 2000){
Toast.makeText(this, "请再按一次退出", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
} else {
finish();
}
}
在页面出现一个圆圈进度条,他是执行一个耗时操作的任务,在这里对其进行睡眠达到这个效果。则需要一个新的子线程来执行这个操作:
PopupWindow pop;
ProgressDialog pd;
//进度框的显示
public void pdshow(){
pd = new ProgressDialog(this);
pd.setTitle("消息框");
pd.setMessage("请稍后。。。");
pd.setCancelable(true);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.show();
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
//关闭进度条
pd.dismiss();
}
};
public void btonclick(View v){
//调用显示进度条的方法
pdshow();
//新建立一个子线程让其在三秒之后把刚才打开的进度条关闭
new Thread(){
@Override
public void run() {
super.run();
for(int i=0; i<3; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(0);
}
}.start();
/*LayoutInflater inflater = LayoutInflater.from(this);
View myview = inflater.inflate(R.layout.layout_my_dialog, null);
//AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setView(myview);
pop = new PopupWindow(myview, 600, 500);
myview.findViewById(R.id.bt_02).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(MainActivity2.this, "点击了确定", Toast.LENGTH_SHORT).show();
pop.dismiss();
}
});
//pop.showAsDropDown(v);
pop.showAtLocation(v, Gravity.CENTER, 0, 0);*/
//dialog = builder.create();
//dialog.show();
//builder.show();
}如果把圆圈的进度条转化为长的进度条时:
PopupWindow pop;
ProgressDialog pd;
public void pdshow(){
pd = new ProgressDialog(this);
pd.setTitle("消息框");
pd.setMessage("请稍后。。。");
pd.setCancelable(true);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(10); //最终需要完成的量
pd.show();
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg); 需要根据不同的message判断应该怎么处理
if(msg.what == 0){
pd.dismiss();
} else {
pd.setProgress(msg.arg1);
}
}
};
public void btonclick(View v){
pdshow();
new Thread(){
@Override
public void run() {
super.run();
for(int i=1; i<11; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//不在进行发送空消息 而是发送包含message的消息以进行判断
Message msg = Message.obtain();
msg.arg1 = i;
msg.what = 1;
handler.sendMessage(msg);
}
handler.sendEmptyMessage(0);
}
}.start();
/*LayoutInflater inflater = LayoutInflater.from(this);
View myview = inflater.inflate(R.layout.layout_my_dialog, null);
//AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setView(myview);
pop = new PopupWindow(myview, 600, 500);
myview.findViewById(R.id.bt_02).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(MainActivity2.this, "点击了确定", Toast.LENGTH_SHORT).show();
pop.dismiss();
}
});
//pop.showAsDropDown(v);
pop.showAtLocation(v, Gravity.CENTER, 0, 0);*/
//dialog = builder.create();
//dialog.show();
//builder.show();
}在这顺便说一下 当退出一个程序的时候,需求是需要按两次退出时才退出:
实现代码:
private long mExitTime;
@Override
public void onBackPressed() {
//super.onBackPressed();
/*new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("确认对话框")
.setMessage("您真的要退出程序么?")
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).show();*/
//在第一次点击退出的时候mExitTime默认是为0的所以一开始两个的差值必然是大于2分钟的 然后取当前按下的时间给mExtiTime进行赋值再进行差值判断
if((System.currentTimeMillis()-mExitTime) > 2000){
Toast.makeText(this, "请再按一次退出", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
} else {
finish();
}
}
相关文章推荐
- android开发Enum (枚举)的完美替代 —— @IntDef的使用
- Android内存优化大全
- Android 对Android客户端与服务端传递的Json数据进行加密、解密操作
- 《第一行代码--Android》读书笔记之内容提供器
- Android 开发如何做好内存优化
- Android Intent 用法全面总结
- Android setOnItemLongClickListener setOnItemClickListener 同时触发解决
- android笔记 看过stormzhang大大的博客(关于像素,屏幕密度)
- android笔记 销毁规则
- Android Volley完全解析总结
- mac android 开发 获取 SHA1和MD5
- android中json数据解析详解
- 如何把使用到android res文件夹下面资源(R.xx.xx)的工程打包成jar文件,供其它项目使用
- Android SDK Manager更新
- Android之禁止GridView上下滑动
- Android 中如何启动计时器线程
- 收藏——android SDK下载失败和更新方法
- Android之不能静态注册的系统广播(5个)
- java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/LruCache;
- Android判断横屏竖屏代码