Android开发笔记九

一、代码优化


1、重构:把一个方法移到另外一个类中(F6)。

2、将多个并行的按钮,替换成listview。

二、多线程学习


1、Android进程的分类:

       (1)前台进程:即与用户正在交互的Activity或者Activity用到的Service等,如果系统内存不足时前台进程是最后被杀死的;

      (2)可见进程:可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见,但由于失去了焦点而不能与用户交互;

      (3)服务进程:其中运行着使用startService方法启动的Service,虽然不被用户可见,但是却是用户关系的,例如用户正在非音乐界面听的音乐或者正在非下载页面自己下载的文件等;当系统要用空间运行前两者进程时才会被终止;

      (4)后台进程:其中运行着执行onStop方法而停止的程序,但是却不是用户当前关心的,例如后台挂着的QQ,这样的进程系统一旦没有内存就首先被杀死;

      (5)空进程:不包含任何应用程序的程序组件的进程,这样的进程系统是一般不会让他存在的;

2、由于单线程而导致的ANR错误:

      ANR错误(Application Not Responding),指主UI进程被阻塞超过5秒钟而出现的错误,它会终止程序的正常运行,我们要避免它 ,而产生ANR错误的原因就是:单线程。

3、主线程/UI线程 和 WORK线程之间的通信

      在工作线程中更新UI线程的几个方法:Activity.runOnUiThread(Runnable)

                                                     View.post(Runnable)

                                                     View.postDelayed(Runnable,long)

                                                     Handler

4、AsyncTask

      AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。

      AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。

      Params 启动任务执行的输入参数,比如HTTP请求的URL。

      Progress 后台任务执行的百分比。

      Result 后台执行任务最终返回的结果,比如String。

      AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。

1) 子类化AsyncTask

2) 实现AsyncTask中定义的下面一个或几个方法

      onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。

      doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。

       onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

       onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

       1) Task的实例必须在UI thread中创建

       2) execute方法必须在UI thread中调用

       3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...),  onProgressUpdate(Progress...)这几个方法

       4) 该task只能被执行一次,否则多次调用时将会出现异常

       doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

5、New Thread()弊端

     每次new Thread新建对象性能差

    线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。

    缺乏更多功能,如定时执行、定期执行、线程中断。

6、ThreadPoolExecutor 线程池

      重用存在的线程,减少对象创建、消亡的开销,性能佳。

     可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。

     提供定时执行、定期执行、单线程、并发数控制等功能。

你可能感兴趣的:(Android开发笔记九)