`
yzyspy
  • 浏览: 82208 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android多线程开发

 
阅读更多

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);
		} 


    }

}
分享到:
评论
2 楼 sunsenzhen 2015-01-04  
线程用过不释放吗?
1 楼 fategaga 2014-02-27  
这是多线程么?

相关推荐

    Android多线程操作

    标题"Android多线程操作"和描述"Android多线程开发实例,对使用多线程的用户有一定的参考价值!"暗示我们将深入探讨Android中的线程管理以及如何在实践中有效利用。 Android系统默认运行在主线程,也被称为UI线程,...

    Android多线程PPT教学课件.pptx

    【Android多线程】\n\n在Android开发中,多线程是不可或缺的一部分,它能够提升应用程序的性能和用户体验。Android系统默认在一个主线程中运行应用程序,包括UI更新,如果在此线程中执行耗时操作,会导致用户界面...

    Android多线程文件上传

    本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程,提高效率,并确保应用的响应性。 一、多线程基础 多线程是并发执行多个任务的能力,它允许应用程序同时处理多个任务,提高...

    Android开发中的多线程编程技术

    在Android应用开发中,多线程技术是必不可少的,它能帮助开发者实现高效的代码执行,提升用户体验,并确保应用程序的响应性。本资源包主要聚焦于Android平台上的多线程编程,包括理论概念、最佳实践以及实际应用案例...

    Android开发(个人整理01) 线程Demo源码

    以上内容是根据"Android开发(个人整理01) 线程Demo源码"所涉及的Android线程开发知识,这些知识点对于理解和优化Android应用程序的性能至关重要。在实际项目中,开发者应熟练掌握并灵活运用这些概念和技巧。

    Android多线程分段下载源码

    这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的分块下载,并允许用户自定义线程数来控制下载速度和效率。下面我们将详细探讨这一技术。 首先,我们要理解什么是分段下载。传统的单线程...

    android 服务组件多线程交互

    android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。

    Android多线程文件夹下载及断点续传

    在Android开发中,进行大文件下载时,为了提高效率并充分利用设备资源,通常会采用多线程下载技术。此外,为了提升用户体验,断点续传功能也显得尤为重要,尤其是在网络不稳定或者用户中断下载后,可以从上次停止的...

    android多线程下载

    通过以上步骤,我们可以实现一个功能完善的Android多线程下载器,它支持暂停、断点续传,并能够根据用户需求进行定制。在项目实践中,务必注意线程同步和数据一致性,以保证下载的正确性。 最后,提供的...

    Android多线程下载实现方案

    通过安装`demo.apk`,你可以直观地看到多线程下载的运行效果,同时也可以参考代码学习具体的实现方法,这对于理解和掌握Android多线程下载技术非常有帮助。 总结,Android多线程下载是提升用户体验的重要手段,通过...

    android多线程demo(很清晰很详细)

    本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...

    Android多线程下载

    **一、Android多线程下载** 1. **多线程概念**:多线程是指在一个程序中同时运行多个线程,每个线程处理不同的任务。在下载场景下,多线程意味着将一个大文件分割成多个小部分,每个部分由一个独立的线程负责下载。...

    android多线程机制

    Android多线程机制是Android开发中非常重要的一部分,尤其是在处理耗时任务(如网络请求、大数据处理等)时,避免阻塞UI线程,保证应用程序的流畅性和响应性。本文将详细介绍Android多线程的基本原理及其核心组成...

    android多线程断点下载

    总之,Android多线程断点下载是提高用户体验的重要手段,封装好的接口可以让开发者更专注于业务逻辑,而不是复杂的下载实现。通过合理地分块、线程管理和状态保存,我们可以构建一个高效、可靠的下载系统。

    android 多线程下载源代码

    在Android开发中,多线程下载是一项常见的任务,特别是在处理大文件时,为了提高下载速度和用户体验,通常会采用多线程技术。本资源提供的"android 多线程下载源代码"是一个很好的学习资料,可以帮助开发者理解并...

    Android多线程实现简单字符串计数器

    这个简单的例子展示了Android多线程的基本用法,但实际开发中可能需要考虑更多因素,比如异常处理、线程同步、内存管理等。随着技术的发展,Android也引入了更现代的异步处理库,如Retrofit、LiveData、Coroutines等...

    Android多线程全新讲解.pdf

    6. Android开发中的多线程:虽然文档标题提到了Android,但在提供的内容中并没有直接提及Android多线程的特殊性。不过,因为文档内容涉及到Java多线程基础和高级特性,这些知识是Android平台下进行多线程编程所必需...

    Android多线程下载Demo

    本文将深入探讨Android多线程下载的原理、实现方式以及优化策略。 首先,我们要理解为什么需要多线程下载。在单线程下载中,数据流从服务器到客户端是连续的,如果网络状况不佳或者文件体积过大,下载速度可能会...

    Android多线程下载(二)

    总之,Android多线程下载涉及到了Android线程模型、并发控制、文件操作等多个方面,需要开发者有扎实的基础知识和实践经验。通过合理利用多线程,不仅可以提升应用性能,还能提高用户满意度。在实际开发中,要根据...

    Android多线程下载文件

    综上所述,"Android多线程下载文件"是一个涉及多方面技术的复杂任务,包括多线程编程、数据库操作、文件I/O、错误处理等。通过合理的设计和实现,我们可以创建一个高效、可靠的下载系统,为用户提供无缝的下载体验。

Global site tag (gtag.js) - Google Analytics