Android深入浅出学习笔记之多线程及异步处理

 一、目前线程用两种方法实现:
    (1)用户态线程:(Linux)
    由于内核并没有对多线程进程的支持,因此,内核中只有单线程进程的概念, 而多线程进程是通过一个和应用程序连接的函数库实现的。由于内核没有轻量 级进程(线程)的概念,因此它不能独立的对之进行调度,而是由一个线程运 行库来组织线程的调度,其主要工作在于在各个线程的栈之间调度。如果一个进程中的某一个线程调用了一个阻塞的系统调用,该进程就会被阻塞,当然该进程中的其他所有线程也同时被阻塞,因此UNIX使用了异步I/O机制。

    这种机制主要的缺点在于在一个进程中的多个线程的调度中无法发挥多处理器的优势(如上述的阻塞情况)。

    其优点包括:
    A (相对于进程操作而言)某些线程操作的系统消耗大大减少。比如,对属于同一个进程的线程之间进行调度切换时不需要调用系统调用,因此将减少额 外的消耗,往往一个进程可以启动上千个线程也没有什么问题。

    B 用户态线程的实现方式可以被定制或修改以适应特殊应用的要求。这对于多 媒体实时过程等尤其有用。另外,用户态线程可以比核心态线程实现方法的默认情况支持更多的线程。

LINUX的线程库有NPTL(Native POSIX Thread Library)和LinuxThreads。


    (2)核心态线程(Window)
    这种线程的实现方法允许不同进程中的线程按照同一相对优先调度方法进行调 度。这有利于发挥多处理器的并发优势。

 

 

二、Handler、Looper、MessageQueue介绍

Handler用于异步消息处理,但是Handler自己并不会创建线程。一般Handler用于计划任务和线程间的通信。

在后台线程与UI线程的交互中最常用。原理是:系统启动程序时,会自动为UI线程创建一个消息队列,和用于管理这个消息队列的Looper。在创建的后台线程时,默认是不会创建Looper和消息队列的(我们自己可以通过调用Looper.prepare()给后台线程创建Looper和消息队列)。

通过给Handler传递不同的Looper实现向不同的线程传递信息。Looper.getMainLooper()会获得UI线程的Looper。(后面我们会用代码实现)

 

三、Android多线程与界面交互的方法

1.Activity.runOnUIThread(Runnable)

 

2.View.post(Runnable),View.postDelay(Runnable,long)

 

3、Handler

 

4、AsyncTask

 

下面用一个工程实现了上面四种交互方法

 

public class MainActivity extends Activity {

	private TextView txView;
	private Button button;
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	Log.i("RootyInfo", "oncreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    
        
        txView=(TextView)findViewById(R.id.textView1);
        button=(Button)findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				//创建一个用于展示前三种后台线程和UI线程交互的线程
				new TestThread(MainActivity.this).start();
				
				//创建一个用于展示AsyncTask实现交互的TestAsyncTask
				new TestAsyncTask().execute("Test"," AsyncTask");
			}
		});
    }
    
    
    class TestAsyncTask extends AsyncTask<String, Integer, String>
    {
    	//TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
		}

		//doInBackground执行完后由UI线程调用,用于更新界面操作
		@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			txView.setText(result);
			super.onPostExecute(result);
		}

		//在PreExcute执行后被启动AysncTask的后台线程调用,将结果返回给UI线程
		@Override
		protected String doInBackground(String... params) {
			// TODO Auto-generated method stub
			StringBuffer sb=new StringBuffer();
			for (String string : params) {
				sb.append(string);
			}
			return sb.toString();
		}
    	
    }
    //用于线程间通信的Handler
    class TestHandler extends Handler
    {
    	
		public TestHandler(Looper looper) {
			super(looper);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			System.out.println("123");
			txView.setText((String)msg.getData().get("tag"));
			super.handleMessage(msg);
		}
    	
    }
    //后台线程类
    class TestThread extends Thread
    {
        Activity activity;
		public TestThread(Activity activity) {
			
			this.activity = activity;
		}
		@Override
		public void run() {
			
			//下面代码用来演示Activity.runOnUIThread(Runnable)方法的实现
			activity.runOnUiThread(new Runnable() {				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					txView.setText("Test runOnUIThread");
				}
			});
			
			//下面代码用来演示Activity.runOnUIThread(Runnable)方法的实现
			txView.post(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					txView.setText("Test View.post(Runnable)");
				}
			});
			
			//下面代码用来演示Activity.runOnUIThread(Runnable)方法的实现
			txView.postDelayed(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					txView.setText("Test View.postDelay(Runnable,long)");
				}
			}, 1000);
			
			//下面代码用来演示Handler方法的实现
			Message msg=new Message();
			Bundle bundle=new Bundle();
			bundle.putString("tag", "Test Handler");
			msg.setData(bundle);			
			new TestHandler(Looper.getMainLooper()).sendMessage(msg);
					
			super.run();
		}
    	
    }
   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值