2013年6月1日 星期六

[Android] AsyncTask

AsyncTask from API 1.5+
不過事實上 1.0 and 1.1 上也有此功能 只是 API 為 UserTask

Lifecycle
  • activity 結束時 AsyncTask 會繼續執行直到完成,然後呼叫 onCancelled(Result result)或 onPostExecute(Result result),然而因為 activity 已不在,所以 AsyncTask 也無法做接下來的工作。
  • 所以希望能在 activity 結束前先取消 AsyncTask,因此呼叫 cancel(boolean mayInterruptIfRunning),mayInterruptIfRunning 表示是否中斷 執行 thread。


cancel() 不總能正確的發揮效用?!
  • cancel(false): 工作不會被中斷並完整執行完,但執行完後不會呼叫 onPostExecute()
  • cancel(true): 只是會試著盡早中斷我們的工作,若是遇到不可被中斷的工作(ex: BitmapFactory.decodeStream()) 就仍然會執行完。


Memory leaks
AsyncTask 會執有 activity reference。


Serial or parallel?? It depends on the API level.
假設執行下列兩個 task:

new AsyncTask1().execute();
new AsyncTask2().execute();

Before API 1.6 (Donut): Serial
等 task1 執行完才會再執行 task2。
=> performance problems.

API 1.6 to API 2.3 (Gingerbread): Parallel
同時執行在不同的 worker thread。
=> concurrency issues.

API 3.0 (Honeycomb) until now: Serial or parallel
public static void execute(AsyncTask as) {
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) {
        as.execute();
    } else {
        as.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}

* Reference - The dark side of AsyncTask

[Android] View Animation attributes

Translate
  • 執行次數: android:repeatCount="2"
    • 會連原本的一次,所以會執行三次。
  • 移動距離
    • 0: 表示目前位置,距離是相對位置,往上/左是 -,往下/右是 +。
    • -100%p: 上/左; 100%p: 下/右。
      • android:fromYDelta="-100%p" 上
      • android:fromXDelta="0" android:toXDelta="-100%p" 往左邊消失
      • android:fromXDelta="-100%p" android:toXDelta="0" 從左邊進
      • android:fromXDelta="0" android:toXDelta="100%p" 往右邊消失
      • android:fromXDelta="100%p" android:toXDelta="0" 從右邊進
  • 没有指定 fromXType toXType fromYType toYType 時候, 默許是以自己為相對参照物。


Scale
  • fromXScale/toXScale/fromYScale/toYScale
    • 動畫開始與结束時的縮放比例。
  • 縮小 < 1.0 (無變化) < 放大。 
  • pivotX/pivotY: 缩放時的中心。
    • 0.5 or 50% 為 X 或 Y 座標上的中點位置。 


Rotate
  • fromDegrees/toDegrees: 動畫開始結束時旋轉的角度。
  • 逆時針 < 0 < 順時針。 
  • (-, +): 順時針旋轉。 
  • (-, -): 逆時針旋轉。 
  • (+, +): 順時針旋轉。 
  • (+, -): 逆時針旋轉。 
  • pivotX/pivotY: 旋轉時的中心。 
    • 數字: 相對於自己左邊的 pixel 位置。
    • num%: 相對於自己左邊或上邊的百分比。 
    • num%p: 相對於 parent 左邊或上邊的百分比。 


* Reference
- View Animation
- 详解Android动画之Tween Animation