安卓多线程编程,什么是android多线程编程技术

1 , 什么是android多线程编程技术Android 应用一般分为主线程和工作线程,而主线程主要用来初始化UI,工作线程主要用来进行耗时操作,比如网络连接 , 读取数据库等,这就涉及到到多线程的一些知识,当然还有其他更加复杂的情况 。
2,说说在 Android 中如何实现多线程编程最简单的自然是new thread().start()了 。想要性能好点就用上java的线程池(百度有教程),也可以用asynctask实现 。一般来说各线程间最好别有依赖关系,这样好控制<a href="http://wenwen.soso.com/z/urlalertpage.e?sp=shttp%3a%2f%2fwww.apkbus.com%2fforum.php%3fmod%3dviewthread%26tid%3d15380%26reltid%3d68511%26pre_thread_id%3d0%26pre_pos%3d1%26ext%3d" target="_blank">http://www.apkbus.com/forum.php?mod=viewthread&amp;tid=15380&amp;reltid=68511&amp;pre_thread_id=0&amp;pre_pos=1&amp;ext=</a> 这个是别人写的一个demo,我没试过,你看看吧【安卓多线程编程,什么是android多线程编程技术】
3,android多核多线程该如何用在程序开发的实践当中,为了让程序表现得更加流畅,我们肯定会需要使用到多线程来提升程序的并发执行性能 。但是编写多线程并发的代码一直以来都是一个相对棘手的问题,所以想要获得更佳的程序性能,我们非常有必要掌握多线程并发编程的基础技能 。众所周知 , Android 程序的大多数代码操作都必须执行在主线程,例如系统事件(例如设备屏幕发生旋转),输入事件(例如用户点击滑动等),程序回调服务,UI 绘制以及闹钟事件等等 。那么我们在上述事件或者方法中插入的代码也将执行在主线程 。一旦我们在主线程里面添加了操作复杂的代码 , 这些代码就很可能阻碍主线程去响应点击/滑动事件,阻碍主线程的 UI 绘制等等 。我们知道 , 为了让屏幕的刷新帧率达到 60fps,我们需要确保 16ms 内完成单次刷新的操作 。一旦我们在主线程里面执行的任务过于繁重就可能导致接收到刷新信号的时候因为资源被占用而无法完成这次刷新操作,这样就会产生掉帧的现象 , 刷新帧率自然也就跟着下降了(一旦刷新帧率降到 20fps 左右,用户就可以明显感知到卡顿不流畅了) 。为了避免上面提到的掉帧问题 , 我们需要使用多线程的技术方案,把那些操作复杂的任务移动到其他线程当中执行 , 这样就不容易阻塞主线程的操作,也就减小了出现掉帧的可能性 。那么问题来了 , 为主线程减轻负的多线程方案有哪些呢?这些方案分别适合在什么场景下使用?Android 系统为我们提供了若干组工具类来帮助解决这个问题 。AsyncTask: 为 UI 线程与工作线程之间进行快速的切换提供一种简单便捷的机制 。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景 。HandlerThread: 为某些回调方法或者等待某些任务的执行设置一个专属的线程 , 并提供线程任务的调度机制 。ThreadPool: 把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理 。IntentService: 适合于执行由 UI 触发的后台 Service 任务,并可以把后台任务执行的情况通过一定的机制反馈给 UI 。了解这些系统提供的多线程工具类分别适合在什么场景下,可以帮助我们选择合适的解决方案,避免出现不可预期的麻烦 。虽然使用多线程可以提高程序的并发量,但是我们需要特别注意因为引入多线程而可能伴随而来的内存问题 。举个例子,在 Activity 内部定义的一个 AsyncTask,它属于一个内部类,该类本身和外面的 Activity 是有引用关系的,如果 Activity 要销毁的时候 , AsyncTask 还仍然在运行,这会导致 Activity 没有办法完全释放,从而引发内存泄漏 。所以说,多线程是提升程序性能的有效手段之一,但是使用多线程却需要十分谨慎小心,如果不了解背后的执行机制以及使用的注意事项,很可能引起严重的问题 。
4,android 多线程编程用runnable和handler本来开辟一个新的线程是属于子线程,但是你的Handler是跟主线程绑定的 。严格来说是在子线程中运行 。android中的runnable并不一定是新开的线程,比如下面调用的方法就是运行在ui主线程中hanlder handler = new handler();handler.post(new runnable()public void run()}});官方文档对此的解释是:the runnable will be run on the user interface thread. ”boolean android.view.view .post(runnable action)causes the runnable to be added to the message queue. the runnable will be run on the user interface thread.parameters: action the runnable that will be executed. returns: returns true if the runnable was successfully placed in to the message queue. returns false on failure, usually because the looper processing the message queue is exiting.我们可以通过handler的对象的post方法,把runnable对象(一般是runnable的子类)传过去,handler会在looper中调用runnable的run方法执行,runnable是一个接口 , 不是一个线程,一般线程会实现runnable接口这里我们看代码handler.post(new runnable()runnalbe是一个接口,不是一个线程,一般线程会实现runnalbe接口,所以如果我们使用匿名内部类是运行在ui主线程的,如果我们使用实现这个runnable接口的线程类,则是运行在对应的线程的 。具体来说这个函数的工作原理如下:view.post(runnalbe)方法 , 在post(runanble action)方法中,view获得当前主线程(即ui线程)的handler , 然后将action对象post到handler里面去,在handler里 , 它将传递过来的action对象封装成一个message(message 的callback为action),然后将其投入到ui线程的消息循环中,在handler再次处理该message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法,而此时,已经路由到ui线程里 , 因此我们可以毫无顾虑来更新ui 。如下图,前面看到的代码,我们这里的message的callback为一个runnalbe的匿名内部类,这种情况下,由于不是在新的线程中使用 , 所以千万别做复杂的计算逻辑 。

    推荐阅读