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 };
View Code

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     };
View Code

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 }
View Code

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    }
View Code

小结:

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

posted @ 2014-12-15 14:22  壬子木  阅读(120)  评论(0)    收藏  举报