Android深入浅出学习笔记之多线程及异步处理

本文详细介绍了Android中实现多线程与界面交互的四种方法:Activity.runOnUIThread(Runnable), View.post(Runnable), View.postDelay(Runnable,long), Handler。并通过一个工程实例展示了如何使用这些方法实现线程间通信。

  (1)用户态线程:(Linux
    由于内核并没有对多线程进程的支持,因此,内核中只有单线程进程的概念, 而多线程进程是通过一个和应用程序连接的函数库实现的。由于内核没有轻量 级进程(线程)的概念,因此它不能独立的对之进行调度,而是由一个线程运 行库来组织线程的调度,其主要工作在于在各个线程的栈之间调度。如果一个进程中的某一个线程调用了一个阻塞的系统调用,该进程就会被阻塞,当然该进程中的其他所有线程也同时被阻塞,因此UNIX使用了异步I/O机制。

    这种机制主要的缺点在于在一个进程中的多个线程的调度中无法发挥多处理器的优势(如上述的阻塞情况)。

    其优点包括:
    A (相对于进程操作而言)某些线程操作的系统消耗大大减少。比如,对属于同一个进程的线程之间进行调度切换时不需要调用系统调用,因此将减少额 外的消耗,往往一个进程可以启动上千个线程也没有什么问题。

    B 用户态线程的实现方式可以被定制或修改以适应特殊应用的要求。这对于多 媒体实时过程等尤其有用。另外,用户态线程可以比核心态线程实现方法的默认情况支持更多的线程。
LINUX的线程库有NPTL(Native POSIX Thread Library)和LinuxThreads。

\
 \
(2)核心态线程(Window)
    这种线程的实现方法允许不同进程中的线程按照同一相对优先调度方法进行调 度。这有利于发挥多处理器的并发优势。

\
 
二、Handler、Looper、MessageQueue介绍
Handler用于异步消息处理,但是Handler自己并不会创建线程。一般Handler用于计划任务和线程间的通信。
在后台线程与UI线程的交互中最常用。原理是:系统启动程序时,会自动为UI线程创建一个消息队列,和用于管理这个消息队列的Looper。在创建的后台线程时,默认是不会创建Looper和消息队列的(我们自己可以通过调用Looper.prepare()给后台线程创建Looper和消息队列)。
通过给Handler传递不同的Looper实现向不同的线程传递信息。Looper.getMainLooper()会获得UI线程的Looper。(后面我们会用代码实现)
三、Android多线程与界面交互的方法
1.Activity.runOnUIThread(Runnable)
 2.View.post(Runnable),View.postDelay(Runnable,long)
 3、Handler
 4、AsyncTask
 下面用一个工程实现了上面四种交互方法
public class MainActivity extends Activity { 
 
    private TextView txView; 
    private Button button; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        Log.i("RootyInfo", "oncreate"); 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);     
         
        txView=(TextView)findViewById(R.id.textView1); 
        button=(Button)findViewById(R.id.button1); 
        button.setOnClickListener(new OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
                // TODO Auto-generated method stub 
                 
                //创建一个用于展示前三种后台线程和UI线程交互的线程 
                new TestThread(MainActivity.this).start(); 
                 
                //创建一个用于展示AsyncTask实现交互的TestAsyncTask 
                new TestAsyncTask().execute("Test"," AsyncTask"); 
            } 
        }); 
    } 
     
     
    class TestAsyncTask extends AsyncTask<String, Integer, String> 
    { 
        //TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条 
        @Override 
        protected void onPreExecute() { 
            // TODO Auto-generated method stub 
            super.onPreExecute(); 
        } 
 
        //doInBackground执行完后由UI线程调用,用于更新界面操作 
        @Override 
        protected void onPostExecute(String result) { 
            // TODO Auto-generated method stub 
            txView.setText(result); 
            super.onPostExecute(result); 
        } 
 
        //在PreExcute执行后被启动AysncTask的后台线程调用,将结果返回给UI线程 
        @Override 
        protected String doInBackground(String... params) { 
            // TODO Auto-generated method stub 
            StringBuffer sb=new StringBuffer(); 
            for (String string : params) { 
                sb.append(string); 
            } 
            return sb.toString(); 
        } 
         
    } 
    //用于线程间通信的Handler 
    class TestHandler extends Handler 
    { 
         
        public TestHandler(Looper looper) { 
            super(looper); 
            // TODO Auto-generated constructor stub 
        } 
 
        @Override 
        public void handleMessage(Message msg) { 
            // TODO Auto-generated method stub 
            System.out.println("123"); 
            txView.setText((String)msg.getData().get("tag")); 
            super.handleMessage(msg); 
        } 
         
    } 
    //后台线程类 
    class TestThread extends Thread 
    { 
        Activity activity; 
        public TestThread(Activity activity) { 
             
            this.activity = activity; 
        } 
        @Override 
        public void run() { 
             
            //下面代码用来演示Activity.runOnUIThread(Runnable)方法的实现 
            activity.runOnUiThread(new Runnable() {              
                @Override 
                public void run() { 
                    // TODO Auto-generated method stub 
                    txView.setText("Test runOnUIThread"); 
                } 
            }); 
             
            //下面代码用来演示Activity.runOnUIThread(Runnable)方法的实现 
            txView.post(new Runnable() { 
                 
                @Override 
                public void run() { 
                    // TODO Auto-generated method stub 
                    txView.setText("Test View.post(Runnable)"); 
                } 
            }); 
             
            //下面代码用来演示Activity.runOnUIThread(Runnable)方法的实现 
            txView.postDelayed(new Runnable() { 
                 
                @Override 
                public void run() { 
                    // TODO Auto-generated method stub 
                    txView.setText("Test View.postDelay(Runnable,long)"); 
                } 
            }, 1000); 
             
            //下面代码用来演示Handler方法的实现 
            Message msg=new Message(); 
            Bundle bundle=new Bundle(); 
            bundle.putString("tag", "Test Handler"); 
            msg.setData(bundle);             
            new TestHandler(Looper.getMainLooper()).sendMessage(msg); 
                     
            super.run(); 
        } 
         
    } 
    
}
 

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值