`
antkingwei
  • 浏览: 42042 次
  • 性别: Icon_minigender_1
  • 来自: 日照
社区版块
存档分类
最新评论

Android开发中用到的几种多线程

阅读更多

在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各有个的有点,Thread的运行速度是最快的,AsyncTask的规范性是最棒的,其它两个也有自己的优点,下面先贴上三个列子

1.Thread与Handler组合,比较常见

Handler主要是帮助我们来时时更新UI线程

这里在后天加载100张图片,然后没加载完成一个用handler 返回给UI线程一张图片并显示

最后加载完成返回一个List给UI线程 ,Handler就是一个后台线程与UI线程中间的桥梁

 

package com.android.wei.thread;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class Activity01 extends Activity {
    /** Called when the activity is first created. */
  
    /**读取进度**/
    public final static int LOAD_PROGRESS =0;
    
    /**标志读取进度结束**/
    public final static int LOAD_COMPLETE = 1;
    /**开始加载100张图片按钮**/
    Button mButton = null;
    
    /**显示内容**/
    TextView mTextView = null;
    
    /**加载图片前的时间**/
    Long mLoadStart = 0L;
    /**加载图片完成的时间**/
    Long mLoadEndt = 0L;
    
    Context mContext = null;
    /**图片列表**/
    private List<Bitmap> list;
    /**图片容器**/
    private ImageView mImageView;
    //接受传过来得消息
    Handler handler = new Handler(){
    	public void handleMessage(Message msg){
    		switch(msg.what){
    		case LOAD_PROGRESS:
    			Bitmap bitmap = (Bitmap)msg.obj;
    			mTextView.setText("当前读取到第"+msg.arg1+"张图片");
    			mImageView.setImageBitmap(bitmap);
    			break;
    		case LOAD_COMPLETE:	
    			list = (List<Bitmap>) msg.obj;
    			mTextView.setText("读取结束一共加载"+list.size()+"图片");
    			break;
    		}
    		super.handleMessage(msg);
    	}
    };
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.main);
        mButton =(Button) findViewById(R.id.button1);
        mTextView=(TextView) findViewById(R.id.textView1);
        mImageView =(ImageView) this.findViewById(R.id.imageview);
        mTextView.setText("点击按钮加载图片");
        mButton.setOnClickListener(new OnClickListener(){
        	public void onClick(View v){
        		//调用方法
        		LoadImage();
        	}
        });
        	
        
    }
    public void LoadImage(){
    	new Thread(){
    		public void run(){
    			mLoadStart = System.currentTimeMillis();
    			List<Bitmap> list = new ArrayList<Bitmap>();
    			for(int i =0;i<100;i++){
    				Bitmap bitmap=ReadBitmap(mContext,R.drawable.icon);
    				Message msg = new Message();
    				msg.what = LOAD_PROGRESS;
    				msg.arg1 = i+1;
    				list.add(bitmap);
    				msg.obj = bitmap;
    				handler.sendMessage(msg);
    			}
    			mLoadEndt = System.currentTimeMillis();
    			Message msg = new Message();
    			msg.what = LOAD_COMPLETE;
    			msg.obj=list;
    			msg.arg1 = (int) (mLoadEndt - mLoadStart);
    			handler.sendMessage(msg);
    			
    		}
    	}.start();
    }
    public Bitmap ReadBitmap(Context context,int resId){
    	BitmapFactory.Options opt = new BitmapFactory.Options();
    	opt.inPreferredConfig = Bitmap.Config.RGB_565;
    	opt.inPurgeable = true;
    	opt.inInputShareable = true;
    	InputStream is = context.getResources().openRawResource(resId);
    	return BitmapFactory.decodeStream(is, null, opt);
    }
}

 

2AsyncTask异步多线程

 

AsyncTask的规范型很强,能够时时反映更新的情况

它一般有这么几个方法

 

 * onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
       * doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
      * onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
      * onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.

      * onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

    1) Task的实例必须在UI 线程中创建

    2) execute方法必须在UI 线程中调用

    3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。

    4) 该task只能被执行一次,否则多次调用时将会出现异常

 

package com.android.wei.thread;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class Activity02 extends Activity{
	
	/**开始StartAsync按钮**/
	Button mButton = null;
	
	Context mContext = null;
	
	//内容显示出来
	TextView mTextView = null;
	
	//Timer 对象
	Timer mTimer = null;
	
	/** timerTask 对象**/
	TimerTask mTimerTask = null;
	
	/**记录TimerId**/
	int mTimerId =0;
	/**图片列表**/
	private List<Bitmap> list;
	/**图片容器**/
	private ImageView mImageView;
	public void onCreate(Bundle s){
		super.onCreate(s);
		setContentView(R.layout.main);
		mContext = this;
		mButton =(Button) this.findViewById(R.id.button1);
		mImageView =(ImageView)this.findViewById(R.id.imageview);
		mTextView =(TextView) this.findViewById(R.id.textView1);
		mButton.setOnClickListener(new OnClickListener(){
			public void onClick(View v){
				StartAsync();
			}
		});
		
		
	}
	public void StartAsync(){
		new AsyncTask<Object,Object,Object>(){
            protected void onPreExecute(){
            	//首先执行这个方法,它在UI线程中,可以执行一些异步操作
            	mTextView.setText("开始加载进度");
            	super.onPreExecute();
            }
			@Override
			protected Object doInBackground(Object... params) {
				// TODO Auto-generated method stub
				//异步后台执行,执行完毕可以返回出去一个结果 Object 对象
				//得到开始加载得时间
				list = new ArrayList<Bitmap>();
				for(int i =0;i<100;i++){
					Bitmap bitmap =ReadBitmap(mContext,R.drawable.icon);					
					final ByteArrayOutputStream os = new ByteArrayOutputStream();
					bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
					byte[] image = os.toByteArray();
					Bundle bundle = new Bundle();
					bundle.putInt("index", i);
					bundle.putByteArray("image", image);
					publishProgress(bundle);
					list.add(bitmap);
					
				}
				
				return list;
			}
			protected void onPostExecute(Object result){
				//doInBackground 执行之后在这里可以接受到返回结果的对象
				List<Bitmap> list = (List<Bitmap>) result;
				mTextView.setText("一共加载了"+list.size()+"张图片");
			   super.onPostExecute(result);
			}
			protected void onProgressUpdate(Object... values){
				//时时拿到当前的进度更新UI
				Bundle bundle = (Bundle)values[0];
				byte[] image = bundle.getByteArray("image");
				Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
				int index = bundle.getInt("index");
				mTextView.setText("当前加载进度"+index);
				mImageView.setImageBitmap(bitmap);
				super.onProgressUpdate(values);
			}
			
		}.execute();
	}
	public Bitmap ReadBitmap(Context context,int resId){
		BitmapFactory.Options opt = new BitmapFactory.Options();
		opt.inPreferredConfig = Bitmap.Config.RGB_565;
		opt.inPurgeable = true;
		opt.inInputShareable = true;
		InputStream is = context.getResources().openRawResource(resId);
		return BitmapFactory.decodeStream(is, null, opt);
	}
	
}

 

3TimerTask

 

可以根据我们的设置来间隔性的运行,可以很好的实现监听功能一般也跟handler一起

 

package com.android.wei.thread;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TimerTaskActivity extends Activity{
	/**执行Timer进度**/
	public final static int LOAD_PROGRESS =0;
	
	/**关闭TImer进度**/
	public final static int CLOSE_PROGRESS =1;
	
	/**开始TIMERTASK按钮**/
	Button mButton0 = null;
	
	/**关闭TIMERTASK按钮**/
	Button mButton1 =null;
	
	/**显示内容**/
	TextView mTextView = null;
	
	Context mContext = null;
	
	/**timer对象**/
	Timer mTimer = null;
	
	/**TimerTask对象**/
	TimerTask mTimerTask = null;
	
	/**记录TimerID**/
	int mTimerID =0;
	
	Handler handler = new Handler(){
		public void handleMessage(Message msg){
			switch(msg.what){
			case LOAD_PROGRESS:
				mTextView.setText("当前得TimerID为:"+msg.arg1);
				break;
			case CLOSE_PROGRESS:
				mTextView.setText("当前Timer已经关闭请重新启动");
				break;
			}
			super.handleMessage(msg);
		}
	};
    protected void onCreate(Bundle s){
    	setContentView(R.layout.timer);
    	mContext  = this;
    	mButton0 = (Button) this.findViewById(R.id.button1);
    	mButton1 = (Button) this.findViewById(R.id.button2);
    	mTextView = (TextView) this.findViewById(R.id.textView1);
    	mTextView.setText("点击按钮开始更新时间");
    	mButton0.setOnClickListener(new OnClickListener(){
    		public void onClick(View v){
    			StartTimer();
    		}
    	});
    	mButton1.setOnClickListener(new OnClickListener(){
    		public void onClick(View v){
    			CloseTimer();
    		}
    	});
    	super.onCreate(s);
    }
   public void StartTimer(){
	    if(mTimer == null){
	    	mTimerTask = new TimerTask(){

				@Override
				public void run() {
					mTimerID ++;
					Message msg = new Message();
					msg.what = LOAD_PROGRESS;
					msg.arg1 =(int) (mTimerID);
					handler.sendMessage(msg);
					
				}			
	    		
	    	};
	    	mTimer = new Timer();
	    	//第一个参数为执行的mTimerTask
	    	//第二个参数为延迟得事件,这里写1000得意思是 mTimerTask将延迟1秒执行
	    	//第三个参数为多久执行一次,这里写1000 表示没1秒执行一次mTimerTask的Run方法
	    	mTimer.schedule(mTimerTask, 1000,1000);
	    }
   }
   public void CloseTimer(){
	   if(mTimer !=null){
		   mTimer.cancel();
		   mTimer = null;
	   }
	   if(mTimerTask!= null){
		   mTimerTask = null;
	   }
	   mTimerID =0;
	   handler.sendEmptyMessage(CLOSE_PROGRESS);
   }
}

 

分享到:
评论

相关推荐

    android开发的简介和例子

    Intent是Android中用来在组件间通信的机制,它可以启动另一个Activity或者服务,传递数据。 5. **布局设计**:XML用于定义用户界面的布局。开发者需要熟练掌握LinearLayout、RelativeLayout、ConstraintLayout等...

    android开发

    这只是Android开发的冰山一角,还有更多如布局管理、组件交互、网络请求、数据库操作、多线程处理、权限管理等复杂主题等待开发者深入探索。学习Android开发,需要不断实践和积累经验,才能成为一个熟练的Android...

    Mono for android 教程文档实例

    此外,你还可以利用 .NET Framework 提供的强大功能,如 LINQ、多线程和高级数据结构,来提高开发效率和代码质量。 总之, Mono for Android 提供了一个强大的跨平台工具,让 C# 开发者能够轻松进入 Android 开发...

    几个关于Android的程序

    在Android编程领域,开发者可以创建...在实际的项目中,你可能会发现更多的实践技巧和高级特性,如多线程处理、网络请求、异步任务、动画效果等。通过不断地学习和实践,你将能够构建出更复杂、功能丰富的Android应用。

    Android App中用Handler实现ViewPager页面的自动切换

    在Android应用开发中,Handler是一种线程间通信机制,它允许开发者在主线程中处理来自其他线程的消息,从而更新UI。在这个场景中,我们利用Handler实现ViewPager的自动切换效果,这种效果通常用于轮播广告或者相册...

    使用Fragment+Tabhost实现网易新闻客户端的框架

    `TabHost`则是Android中用来创建标签页切换界面的组件,它可以将多个`Fragment`或`Activity`组织在一起,通过标签页进行切换。用户可以通过点击标签来在不同的内容间快速切换,这种设计常见于新闻类应用,方便用户...

    android图像处理系统框架1.2版

    3. **Bitmap操作**:Bitmap是Android中用于存储图像数据的类。新版本可能提升了Bitmap的内存管理,例如更有效的解码策略,以减少内存占用并提高解码速度。同时,也可能提供了新的方法来方便地进行图像裁剪、旋转、...

    Android 实现Word转HTML源码

    总结,`android-word2html-master`项目提供了一种在Android平台上将Word文档转换为HTML的解决方案,涉及到了Apache POI库的使用、文档解析、HTML生成、图像处理以及异步操作等多个技术点。对于想要在Android应用中...

    安卓开发指南中文版,安卓开发必备知识,赶快下载吧

    SQLite数据库是Android中用于存储结构化数据的标准解决方案,可以通过SQL语句进行查询和更新。 #### 十、网络 Android支持多种网络通信协议,如HTTP、FTP等。可以使用AsyncTask或者第三方库如Volley、OkHttp等进行...

    BitmapFunc.zip

    - Bitmap 可以是 ARGB_8888、RGB_565、ARGB_4444 和 ALPHA_8 等几种颜色模式,每种模式有不同的内存占用和显示效果。 2. **加载 Bitmap** - 使用 BitmapFactory 类来从资源文件、本地文件系统、网络或内存中解码...

    Koder,.zip

    如果Koder的代码中用到了Anko,那么它可能增强了项目的Android端功能。 5. **Gradle构建系统**:Kotlin项目通常使用Gradle作为构建工具,它可以管理和编译项目依赖,同时也支持自定义构建脚本,以适应项目特定的...

    图片瀑布流

    4. **ListView/RecyclerView**:这两个组件是Android中用来展示列表数据的关键控件。在瀑布流布局中,我们需要自定义适配器(Adapter)来处理多列布局。可以使用`StaggeredGridLayoutManager`或第三方库如`...

    KotlinDemo:用来练习kotlin

    6. **Anko库**:可能在项目中用到,Anko是JetBrains提供的一个库,简化了Android开发中的许多任务,如DSL(领域特定语言)来创建布局,轻量级的Lambda表达式替代匿名内部类等。 7. **Android开发**:如果项目是针对...

    Tiger_mod:从老虎到老虎

    4. **多线程**:Java提供了强大的多线程支持,允许同时执行多个任务,提高程序效率。Tiger_mod可能利用了线程来实现并行处理或异步操作。 5. **IO流**:Java的IO流用于读写文件和网络通信,可能在Tiger_mod中用于...

    secondRepository:专用于Java

    6. **多线程**:Java提供了内置的多线程支持,使得程序能够同时执行多个任务,提高系统性能。 7. **异常处理**:Java的try-catch-finally语句用于捕获和处理运行时错误,保证程序的健壮性。 8. **Java标准库(JDK...

    webrtc教程

    WebRTC 使用多线程模型来处理不同的任务,如网络通信、媒体处理等。 - **4.1.3 名称转换** 用于在网络通信中转换域名和 IP 地址。 - **4.1.4 SSL 支持** WebRTC 支持通过 SSL/TLS 协议来加密信令消息,保护...

    E41201367_Fauzan-Abdillah_C

    6. **多线程**:Java内置了对多线程的支持,允许程序同时执行多个任务,提升效率。 7. **接口与抽象类**:接口是完全抽象的,只定义方法签名,而抽象类可以有部分实现。它们是实现多态的不同方式。 8. **反射机制*...

Global site tag (gtag.js) - Google Analytics