在J2ME中,多线程的处理是很简单的,似乎并不用考虑很多问题,顶多是同步方面很让人头疼,而在Android中,一切似乎不那么明了了,很重要的一点是在其他线程中是不能直接访问主UI线程成员的。比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的,在C#中也是这样,可能是为了主线程的安全吧。
对于此类情况,Android提供了一些间接访问的方法。
1.runOnUiThread函数
这个函数是Activity的成员函数,格式是public final void runOnUiThread (Runnable action)
在自定义线程中执行对应Activity的runOnUiThread函数就好了,但是很明显,参数还是个线程,这个
函数基本上没什么意义。
2.Handler
这应该是Android多线程中用的最多的工具了,这里Android借鉴了Windows的消息机制,不同线程之间可以用消息进行交流。除了主线程(UI线程)外,通过继承Thread或Runnable生成的线程是不包含消息循环(Looper)的。因此必须在线程中调用Looper.prepare()准备一个消息循环,调用Looper.loop()开始循环,就像是这样:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
这其中Handler是用来接受并处理消息的,如果像上面写的那样调用无参数构造函数生成handler,这个Handler对应的就是所在线程,也可以用Looper做参数,这样生成的Handler对应的是Looper所在的线程。可以通过Looper.myLooper()获取当前线程的Looper。调用Handler对象的sendMessage(Message)函数可以向对应线程发送消息。
例:
public class ThreadMain extends Activity {
/** Called when the activity is first created. */
private final static int MSG_BEGIN=1;
private final static int MSG_END=2;
private ProgressDialog dialog=null;
private Button bt=null;
private Handler handle=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case MSG_BEGIN:
showProgress();
break;
case MSG_END:
dismissProgress();
alertDialog();
break;
}
super.handleMessage(msg);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt=(Button)findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
doThread();
}});
}
private void doThread(){
new Thread(){
public void run(){
try{
sendMsg(MSG_BEGIN);
Thread.sleep(4000);
sendMsg(MSG_END);
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
private void sendMsg(int m){
Message msg=new Message();
msg.what=m;
handle.sendMessage(msg);
}
private void showProgress(){
dialog=ProgressDialog.show(this, "", "正在……", false);
}
private void dismissProgress(){
dialog.dismiss();
}
private void alertDialog(){
new AlertDialog.Builder(ThreadMain.this).setMessage("完成操作")
.setNegativeButton("确定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}}).show();
}
}
3.后台异步任务:
Adnroid的AsyncTask类实现了后台任务的处理,即那些通过“ 提交信息->后台处理->返回结果”步骤完成的任务。
例:
class PageTask extends AsyncTask<String, Integer, String> {
/* 对应类型AsyncTask< doInBackground函数参数类型 , onProgressUpdate函数参数类型 , doInBackground函数返回结果类型>
*/
@Override
protected String doInBackground(String... params) {
/*后台函数,可以放心的调用主线程的成员,params是不定参数 , 取决于执行时的输入,可以用params[0]、params[1]等方式引用*/
return null;
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onPostExecute(String result) {
// 返回结果,result为doInBackground的返回值
message.setText(result);
}
@Override
protected void onPreExecute() {
// 任务启动,可以在这里显示一个对话框,这里简单处理
message.setText(R.string.task_started);
}
@Override
protected void onProgressUpdate(Integer... values) {
// 更新进度
message.setText(values[0]);
}
}
启动方式:
PageTask task = new PageTask();
task.execute(str1,str2);
相关推荐
android多线程机制教程 android多线程机制 android多线程机制 android多线程机制
android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序,android多线程后台下载示例程序
Android 进行文件分段多线程下载的实例,用户可以指定线程数,还可以通过进度条查看下载的进度。
Android实现网络多线程下载,断点续传,压缩包内有两个项目: downloadDemo:多线程下载 MulThreadDownloader:断点续传(网上别人的项目)
一个书上的例子,android多线程下载,支持下载暂停,断点续传
Android 多线程开发实例,对使用多线程的用户有一定的参考价值!
Android多线程下载,支持断点续传,修改线程数。。。。。
android多线程模型和service分析
因Android Studio下整体项目太大,此文件仅包含核心代码,核心都在MainActivity中,包括: 1. 主线程直接加载,不可用; 2. 采用handler+Thread模式实现多线程异步加载; 3. 引入线程池来管理多线程 4. 引入线程池,...
Android多线程下载Demo
android多线程断点下载,完美封装,包括暂停功能。写好接口,android小白即能轻松上手。
Android多线程下载文件,支持断点续传,这里用的数据库存储
android多线程
android 多线程断点下载及进度实时更新demoandroid 多线程断点下载及进度实时更新demo
android多线程管理,实现多线程
Android 多线程下载进度条 demo src
android多线程分段下载apk,子线程更新UI,下载完后跳转至应用安装界面。
android 实现多线程下载源代码 代码详细 很好学习资料
Android多线程全新讲解.pdf
Android多线程下载,移植了上一次java编程中的代码。。。