Android 多线程小结

1、启动欢迎界面
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 // TODO Auto-generated method stub 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.welcome); 6 new Handler().postDelayed(r, 1000);// 1秒后关闭,并跳转到主页面 7 } 8 9 Runnable r = new Runnable() { 10 11 @Override 12 public void run() { 13 // TODO Auto-generated method stub 14 Intent intent = new Intent(); 15 intent.setClass(WelcomeActivity.this, MainActivity.class); 16 startActivity(intent); 17 finish(); 18 } 19 };
2、远程数据库查询
1 // 主线程启动数据库查询线程 2 Thread t = new Thread(QueryDB); 3 t.start(); 4 // 等待子线程结束 5 try { 6 ((Thread) t).join(); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 } 10 listview.setAdapter(adapter); 11 listview.setVisibility(View.VISIBLE); 12 listview.setItemsCanFocus(false); 13 14 15 // 数据库查询子线程,共享数据 16 Runnable QueryDB = new Runnable() 17 { 18 @Override 19 public void run() 20 { 21 // 此处写访问 webservice 代码 22 List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); 23 list = dbUtil.getAllInfo(); 24 // ListItem 25 adapter = new SimpleAdapter( 26 SpeLineListActivity.this, 27 list, 28 R.layout.v1_speline_item, 29 new String[] { "Cno", "Cname", "Cnum" }, 30 new int[] { R.id.txt_company_name, R.id.txt_sl_line, R.id.txt_sl_contact } 31 ); 32 33 } 34 };
3、多线程查询
1 List<Thread> tList = new ArrayList<Thread>(); 2 for (int i = 0; i < tList.size(); i++) { 3 try { 4 tList.get(i).join(); 5 } catch (InterruptedException e) { 6 e.printStackTrace(); 7 } 8 }
4、从 Dialog 跳转到主界面
1 private boolean showNoticeDialog() 2 { 3 String verName = Config.getVerName(mContext); 4 StringBuffer sb = new StringBuffer(); 5 sb.append("当前版本: "); 6 sb.append(verName); 7 sb.append("\n" + updateMsg); 8 9 AlertDialog.Builder builder = new Builder(mContext); 10 builder.setTitle("软件版本更新"); 11 builder.setMessage(sb.toString()); 12 builder.setPositiveButton("下载更新", new OnClickListener() 13 { 14 @Override 15 public void onClick(DialogInterface dialog, int which) 16 { 17 dialog.dismiss(); 18 showDownloadDialog(); 19 } 20 }); 21 builder.setNegativeButton("暂不更新", new OnClickListener() 22 { 23 24 @Override 25 public void onClick(DialogInterface dialog, int which) 26 { 27 dialog.dismiss(); 28 Flag_DownloadAbort = true; 29 showAbort(mContext); 30 } 31 }); 32 noticeDialog = builder.create(); 33 noticeDialog.show(); 34 35 return Flag_DownloadAbort; 36 } 37 38 private void showAbort(Context context){ 39 40 Intent intent = new Intent(); 41 intent.setClass(context, MainActivity.class); 42 context.startActivity(intent); 43 ((Activity) context).finish(); 44 }
小结:
Thread.Yield:调用静态方法 Thread.Yield(),如果在相同的 CPU Core 上存在相同或较低优先级的线程正在等待执行,则当前线程让出时间片。如果没有找到这样的线程,则当前线程继续运行。
Thread.Sleep(0):将 0 传递给 Thread.Sleep(),产生的行为与 Thread.Yield() 类似,唯一的区别就是要在所有的 CPU Core 上查找的相同或较低优先级的线程,而不仅限于当前的 CPU Core。如果没有找到这样的线程,则当前线程继续运行。
Thread.Sleep(1):当前线程此时真正的进入了睡眠状态(Sleep State)。虽然指定的是 1 毫秒,但依据不同系统的时间精度不同,这个操作可能花费 10-15 毫秒。
参考文献:
http://www.cnblogs.com/wolf-sun/p/4175741.html#undefined
http://www.cnblogs.com/gaochundong/p/lock_free_programming.html

浙公网安备 33010602011771号