说明:(之前只用handle是因为主线程默认就加上Looper.prepare()和Looper.loop()的。所以主线程可以通过handle收发信息,但是如果在thread里面的话,就是工作线程,工作线程的话,默认是没有加上那两段代码的,所以要手动加上,然后再通过handle.sendMessage()发送信息到工作线程才能取到信息)
主显示布局以及代码:
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击下载"
/>
<ProgressBar
android:id="@+id/pbDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="2"
style="@android:style/Widget.ProgressBar.Horizontal"
/>
<TextView
android:id="@+id/tvDownload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0%"/>
</LinearLayout>
java代码:
package com.litsoft.main;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
private ProgressBar pbDownload;
private TextView tvDownload;
private Handler mmainHanlder,mworkHandler;
private static final int DOWNLOAD_START = 0;
private static final int DOWNLOADING = 1;
private static final int DOWNLOAD_FINISH = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
initMainHandler();
createWorkHandler();
setListener();
}
private void setListener() {
// TODO Auto-generated method stub
findViewById(R.id.btDownload).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
mworkHandler.sendEmptyMessage(DOWNLOAD_START);
}
});
}
private void createWorkHandler() {
// TODO Auto-generated method stub
new Thread(){
public void run() {
Looper.prepare();//创建Looper对象和工作线程中的MessageQueue
mworkHandler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what==DOWNLOAD_START){
for(int i=0;i<=100;i++){
SystemClock.sleep(2000);
pbDownload.setProgress(i);
Message msg1 = new Message();
msg1.what = DOWNLOADING;
msg1.arg1 = i;
mmainHanlder.sendMessage(msg1);
}
Message msg2 = new Message();
msg2.what = DOWNLOAD_FINISH;
mmainHanlder.sendMessage(msg2);
}
};
};
Looper.loop();//轮询工作线程中的消息队列
};
}.start();
}
private void initMainHandler() {
// TODO Auto-generated method stub
mmainHanlder = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch(msg.what){
case DOWNLOADING:
tvDownload.setText(msg.arg1+"%");
break;
case DOWNLOAD_FINISH:
Toast.makeText(MainActivity.this, "已经完成下载", 20000);
break;
}
}
};
}
private void initview() {
// TODO Auto-generated method stub
pbDownload = (ProgressBar) findViewById(R.id.pbDownload);
tvDownload = (TextView) findViewById(R.id.tvDownload);
}
}
效果:
相关推荐
消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
通过自定义Handler、Looper、Message.浅析Android线程间通信原理
bootstrap-looper 模版 bootstrap-looper 模版 bootstrap-looper 模版
Looper和Handler实现UI线程和子线程的通信
在消息分发时,主线程的looper.loop()方法会遍历所有的消息进行分发,执行耗时任务。我们看下源码的loop()方法: for (;;) { Message msg = queue.next(); // might block if (msg == null) {
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成。 使用Looper需要注意什么 写在...
1.技术博客汇总 2.开源项目汇总 3.生活博客汇总 4.喜马拉雅音频汇总 5.其他汇总
经过探索,我发现可以实现一个主线程给多个线程发送消息,主线程接收每个线程的内容进行处理 下面是我改造的例子:
android 多线程 looper handler的讲解,轻松学明白androd的消息机制,附有很多实例。
|--网络之HttpClient的get和post用法 |--网络之判断网络状态是否可用 |--网络之设置apn |--网络图片查看器 |--网络图片的下载与缓存 |--网络文件的下载与关联进度条 |--联系人之各种查找 |--联系人读写与批量操作 |-...
Handler和looper详解.
android looper handler 子线程 主线程详解
主线程和另一个线程互发消息进行处理的例子.这个例子是从别人那里拿来的,依照个人喜好重新命名而已.因此还是转发.
andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 在Android,这里的线程分为有...
android 中利用 handler 1.主线程内消息发送。2.子线程向主线程发送消息。3.主线程向子线程发送消息
主要介绍了Android 线程之自定义带消息循环Looper的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
如果在Android中判断某个线程是否是主线程?对于这个问题,你可能说根据线程的名字,当然这个可以解决问题,但是这样是最可靠的么?万一某天Google一下子将线程的名字改称其他神马东西呢。 方法揭晓 下面的方法是最...