Handler线程间通信
1 package com.hixin.appexplorer; 2 3 import java.util.List; 4 5 import android.app.Activity; 6 import android.app.ProgressDialog; 7 import android.content.Context; 8 import android.content.pm.PackageInfo; 9 import android.content.pm.PackageManager; 10 import android.os.Bundle; 11 import android.os.Handler; 12 import android.os.Message; 13 import android.view.LayoutInflater; 14 import android.view.View; 15 import android.view.ViewGroup; 16 import android.view.Window; 17 import android.view.WindowManager; 18 import android.widget.BaseAdapter; 19 import android.widget.GridView; 20 import android.widget.ImageView; 21 import android.widget.TextView; 22 23 public class MainActivity extends Activity implements Runnable { 24 25 GridView gv; 26 private List<PackageInfo> packageInfos; 27 private ProgressDialog pd; 28 private Handler mHandler = new Handler() { 29 @Override 30 public void handleMessage(Message msg) { 31 // TODO Auto-generated method stub 32 super.handleMessage(msg); 33 gv.setAdapter(new GridViewAdapter(MainActivity.this)); 34 pd.dismiss(); 35 setProgressBarIndeterminateVisibility(false); 36 } 37 38 }; 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 // requestWindowFeature(Window.FEATURE_NO_TITLE); 43 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 44 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 45 setContentView(R.layout.show_app_grid); 46 47 gv = (GridView)this.findViewById(R.id.gv_apps); 48 pd = ProgressDialog.show(this,"请稍候...", "正在搜索你所安装的应用程序",true,false); 49 setProgressBarIndeterminateVisibility(true); 50 Thread t = new Thread(this); 51 t.start(); 52 } 53 54 @Override 55 public void run() { 56 // TODO Auto-generated method stub 57 packageInfos = getPackageManager().getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); 58 try { 59 Thread.sleep(2000); 60 } catch (InterruptedException e) { 61 // TODO Auto-generated catch block 62 e.printStackTrace(); 63 } 64 mHandler.sendEmptyMessage(0); 65 } 66 67 68 class GridViewAdapter extends BaseAdapter{ 69 70 LayoutInflater inflater; 71 public GridViewAdapter(Context context) { 72 inflater = LayoutInflater.from(context); 73 } 74 @Override 75 public int getCount() { 76 // TODO Auto-generated method stub 77 return packageInfos.size(); 78 } 79 80 @Override 81 public Object getItem(int position) { 82 // TODO Auto-generated method stub 83 return packageInfos.get(position); 84 } 85 86 @Override 87 public long getItemId(int position) { 88 // TODO Auto-generated method stub 89 return position; 90 } 91 92 @Override 93 public View getView(int position, View convertView, ViewGroup parent) { 94 // TODO Auto-generated method stub 95 96 View view = inflater.inflate(R.layout.gv_item, null); 97 TextView tv = (TextView)view.findViewById(R.id.gv_item_appname); 98 ImageView iv = (ImageView)view.findViewById(R.id.gv_item_icon); 99 tv.setText(packageInfos.get(position).applicationInfo.loadLabel(getPackageManager())); 100 iv.setImageDrawable(packageInfos.get(position).applicationInfo.loadIcon(getPackageManager())); 101 102 return view; 103 } 104 105 } 106 107 } 108 109
当需要显示的项目很多,会造成很大的延迟。这时候屏幕会一直黑屏。给用户很不好的体验。应该在获取信息的时候,显示一些进度信息给用户看,增加用户体验。
程序在期间获取安装程序信息,主界面上显示进度条,当信息获取完毕之后(获取信息在新线程里执行),发送一条消息通知主线程,主线程关掉进度条,加载列表。
一、基本概念
Looper:每一个线程都可以产生一个Looper,用来管理线程的Message,Looper对象会建立一个MessgaeQueue数据结构来存放message。
Handler:与Looper沟通的对象,可以push消息或者runnable对象到MessgaeQueue,也可以从MessageQueue得到消息。
线程A的Handler对象引用可以传递给别的线程,让别的线程B或C等能送消息来给线程A。
线程A的Message Queue里的消息,只有线程A所属的对象可以处理。
注意:Android里没有global的MessageQueue,不同进程(或APK之间)不能通过MessageQueue交换消息。
本例中线程A就是UI线程,线程B就是新建的处理线程
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。