`

线程通信之looper之用法--主线程和工作线程

 
阅读更多

 

说明:(之前只用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);
}



}

效果:


分享到:
评论

相关推荐

    android主线程、子线程及线程间通信方式测试app

    在Android中,服务(Service)运行在主线程,如果服务中进行了耗时操作,也需要通过上述线程通信方式来保证UI的响应性。 5. **实践测试**:"android主线程、子线程及线程间通信方式测试app"可能包含了各种示例,...

    子线程更新主线程数据

    在多线程编程中,"子线程更新主线程数据"是一个常见的需求,尤其是在UI界面交互和后台处理相结合的应用中。主线程通常负责用户界面的显示与交互,而子线程则用于执行耗时的任务,避免阻塞主线程,提供良好的用户体验...

    自定义Handler-Looper实现线程间通信

    在Android系统中,主线程默认已经有一个运行的Looper,但如果我们需要在自定义线程中使用Handler进行消息通信,就需要手动创建并启动Looper。这是通过调用Looper.prepare()初始化Looper,然后调用Looper.loop()进入...

    android 主线程给子线程发送消息

    `Handler`是Android中用于在线程间传递消息和调度任务的工具,尤其是主线程与工作线程之间的通信。下面将详细讲解`Handler`的工作原理以及如何在Android中创建和使用`Handler`进行主线程与子线程的消息传递。 1. **...

    Looper和Handler实现UI线程和子线程的通信

    由于Android系统规定所有的UI操作必须在主线程(也称为UI线程)中执行,因此当需要在后台子线程进行耗时操作(如网络请求、数据库操作等)时,就需要一种机制来实现与UI线程的通信,以便更新UI。Looper和Handler正是...

    android demo,实现主线程handle,工作子线程threadHandle的处理

    本示例“android demo,实现主线程handle,工作子线程threadHandle的处理”专注于如何在主线程和子线程之间有效地进行通信。下面将详细讲解这个知识点。 1. 主线程(UI线程): 在Android中,主线程负责处理用户...

    子线程接收主线程发送的消息

    在Android开发中,多线程通信是一个至关重要的概念,尤其是主线程(UI线程)与子线程之间的交互。标题“子线程接收主线程发送的消息”涉及到的是Android中的Handler机制,这是一种处理线程间通信的方式。我们首先来...

    andriod多线程通信handler方法

    为了防止UI线程被阻塞,Android引入了Handler、Looper和Message机制来实现线程间通信,尤其是主线程(UI线程)与工作线程之间的交互。"andriod多线程通信handler方法"这个主题正是关注这一核心概念。 首先,我们...

    Android通用多个线程通信管理框架.doc

    在Android开发中,多线程通信是一个至关重要的概念,特别是在处理耗时操作,如网络请求、数据计算等,以防止阻塞主线程导致应用无响应(ANR)。本篇文章将详细解析Android中一种通用的多线程通信管理框架,即基于...

    Android主线程给多个线程发送消息

    总结来说,Android主线程通过`Handler`和`Looper`机制可以有效地与多个工作线程进行通信。这种模式不仅避免了直接操作UI的潜在风险,还确保了UI更新的同步性,是Android异步编程的重要工具。在实际项目中,还可以...

    Android Looper使用介绍

    在 Android 开发中,Looper 对象的使用非常频繁,因此需要非常了解 Looper 对象的机制和使用方法,以便更好地开发 Android 应用程序。 Android 官方文档中对 Looper 的介绍中,Looper 被描述为一个用于运行消息...

    子线程和主线程通过handler 双向通信

    在Android开发中,多线程通信是一个至关重要的概念,尤其是主线程(UI线程)与子线程之间的交互。本文将深入探讨如何使用Handler机制实现主线程与子线程,以及HandlerThread之间的双向通信。 首先,理解Android的...

    android主线程和另一线程互发信息

    总结来说,`android主线程和另一线程互发信息`涉及到Android中的多线程通信机制,主要依赖`Handler`、`Looper`和`Message`。`Handler`负责发送和处理消息,`Looper`负责在一个线程中循环检查消息队列,`Message`则是...

    Android线程模式(handler,thread,looper)

    总结一下,Android的Handler-Thread-Looper模型是多线程通信的关键,通过Handler发送消息,Thread执行后台任务,Looper负责消息的调度,共同保证了UI线程的流畅性和应用程序的高效运行。开发者应当熟练掌握这些概念...

    关于Looper的使用

    了解了Looper的基本概念和使用方法后,开发者可以根据实际需求灵活运用。在项目中,合理地利用Looper、Handler和Message,可以实现高效的线程间通信,提高代码的可维护性和性能。在阅读和分析`LooperTest`相关的源码...

    管理MessageQueue的Looper使用

    通常,主线程(UI线程)已经有一个默认的`Looper`在运行,因此我们可以在主线程中直接发送和处理消息。然而,在非主线程中,如果不手动创建并启动`Looper`,则无法执行消息处理。 描述中提到的链接文章《不使用默认...

    android 线程通信学习

    在Android应用开发中,线程通信是至关重要的一个环节,它涉及到UI线程与工作线程之间的数据交换和控制流程。本教程将深入探讨Android线程通信的基本概念、常用方法以及如何通过Demo来实践这些技术。 一、Android...

    055集-线程通信案例

    本教程“055集-线程通信案例”聚焦于如何在Android应用程序中有效地管理和同步多个线程,以避免阻塞主线程并提高应用性能。 主线程,也称为UI线程,负责处理用户交互和绘制屏幕。为了确保用户体验不被阻塞,耗时的...

    Handler + Thread + Looper

    AsyncTask内部就使用了Handler、Thread和Looper的概念,它会在一个工作线程中执行任务,然后通过回调方法在主线程中更新UI。 总的来说,理解和熟练运用Handler、Thread和Looper对于Android开发者至关重要,因为它们...

    子线程和主线程5种交互方式 Demo

    在Android应用开发中,线程间的交互是必不可少的,尤其是子线程与主线程之间的通信。主线程,也称为UI线程,负责处理用户界面的更新和事件响应,而子线程通常用于执行耗时操作,如网络请求、数据处理等,以避免阻塞...

Global site tag (gtag.js) - Google Analytics