Android 多线程

1、简介

     多线程的用途是不言而喻的,例如,我们下载一个文件,在下载过程当前我们又要执行其他的操作。如果都放在主线程中,UI界面将不能操作,需要等待。

 

2、Android 平台下的多线程

     Android 平台下的线程分为主线程(也叫UI线程) 和 工作线程(非UI线程)。在Android 平台中 非UI线程 是不能访问UI线程中的View组件的。这个必须清楚。例如我们执行下面的代码就会报错。这个例子我们模拟一个下载场景,有一个下载按钮,一个其他操作按钮,一个TextView显示当前下载状态,当我们在工作线程中更新TextView文本内容是就会报错。

package com.powerise.thread;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	private Button downBtn;
	
	private TextView stateTextView;
	
	private DownloadThread dt;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        downBtn = (Button) findViewById(R.id.downBtn);
        
        stateTextView = (TextView) findViewById(R.id.stateTextView);
        
        dt = new DownloadThread();
        
        downBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dt.start();
			}
		});
    }
	
	private final class DownloadThread extends Thread {
		@Override
		public void run() {
			stateTextView.setText("下载中...");
			try {
				Thread.sleep(5000);
			} catch (Exception e) {
				
			}
			stateTextView.setText("下载完成!");
		}
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<TextView android:id="@+id/stateTextView"  
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    />
	<Button android:id="@+id/downBtn"  
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:text="downBtn"
	    />
</LinearLayout>

 

 为了实现UI线程和工作线程之间的通信我们需要使用Handler对象发送消息和处理消息。

package com.powerise.thread;

import android.app.Activity;
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 MainActivity extends Activity {
	
	private Button downBtn;
	
	private TextView stateTextView;
	
	private DownloadThread dt;
	private DownloadHandler dh = new DownloadHandler();
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        downBtn = (Button) findViewById(R.id.downBtn);
        
        stateTextView = (TextView) findViewById(R.id.stateTextView);
        
        dt = new DownloadThread();
        
        downBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dt.start();
			}
		});
    }
	
	private final class DownloadThread extends Thread {
		@Override
		public void run() {
			dh.sendEmptyMessage(1);
			try {
				Thread.sleep(5000);
			} catch (Exception e) {
				
			}
			dh.sendEmptyMessage(-1);
		}
	}
	
	private final class DownloadHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
				case 1:
					stateTextView.setText("下载中...");
					break;
				case -1:
					stateTextView.setText("下载完成!");				
					break;
				default :
					break;
			}
		}
	}
}

 还有问题, 就是当不停的点 Button 时, 也会报错.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值