1. 程式人生 > >Android第二十二課 SurfaceView原始碼以及崩潰剖析

Android第二十二課 SurfaceView原始碼以及崩潰剖析

1 在eclipse中檢視Android原始碼

假設我們想參看Activity類的原始碼,按著Ctrl鍵,左擊它,現實的結果卻看不到程式碼的,提示的資訊便是“找不到Activity.class檔案”。下載好Android原始碼之後,點選Attached Source,選擇External location

External Folder資料夾選單,選擇Android所在的目錄即可

http://jingyan.baidu.com/article/5d368d1e01df803f60c057f8.html


2 SurfaceView的繼承關係

public class android.view.SurfaceView extendsandroid.view.View


3 如何知道Activity控制元件渲染完畢,可以監聽事件Activity是否獲得焦點

當activity獲得焦點之後,activity是載入完畢的了,這個方法的技巧性比較強,很難想到。

1.     @Override

2.     publicvoid onWindowFocusChanged(boolean hasFocus) {

3.      // TODOAuto-generated method stub

4.     super.onWindowFocusChanged(hasFocus);

5.     if(hasFocus){

6.       showPopupWindow(getApplicationContext());

7.      }

8.     }


4 Surface的建立與有效性

當SurfaceView被例項化時,Surface並沒有立即建立。相反,它是非同步建立的。每當活動暫停或再次恢復而重新建立時,該Surface都將被銷燬

只要Surface沒有生效,我們就不能從SurfaceHolder中獲取Canvas。不過,我們可以通過下面的語句來檢視Surface是否已被建立:

boolean isCreated =surfaceHolder.getSurface().isValid();

如果該方法返回true,我們就可安全的鎖定該Surface並通過接收到的Canvas來在其上進行繪製。我們必須絕對確保在呼叫SurfaceHolder.lockCanvas()之後再次解鎖Surface,否則我們的活動可能會鎖定手機。

參考

http://www.2cto.com/kf/201302/188341.html


5 Thread與SurfaceView

     View元件由UI執行緒(主執行緒)所執行。如果需要迅速更新UI畫面或UI畫圖需要較長時間,則需要使用SurfaceView。它可由後臺執行緒(background thread)來執行,而View只能由UI(主)執行緒執行。SurfaceView內有高效的rendering機制,可以讓後臺執行緒快速重新整理Surface的內容。

     View ---> UI(主)執行緒

     SurfaceView ---> 後臺執行緒 

參考

http://blog.csdn.net/myarrow/article/details/14223493


7 在找findViewById的過程中,由於開始忽略子類ViewGroup對View方法的重寫,導致在View.class萬行程式碼中陷入死迴圈 

http://www.2cto.com/kf/201506/410705.html 

 

8 viewRoot 的目的,實際上在什麼地方渲染控制元件

每個activity有個window,window被windowmanager管理.

每個window都有decorview.

每個window都有ViewRoot.

繪製發起從ViewRoot.

事件傳遞發起衝ViewRoot.

繪製傳遞canvas, canvas來自surface.

http://blog.csdn.net/jacklam200/article/details/50038989



9 SurfaceView傳遞給底層NDK出錯提示如下:

E/ExtMediaPlayer-JNI: env->IsInstanceOffails

E/MediaPlayer-JNI: JNIMediaPlayerFactory:bIsQCMediaPlayerPresent 0

private SurfaceHolder holder;

在檢視的例子當中都是使用holder = this.getHolder();獲取SurfaceHolder,

而沒有通過引數的傳遞獲取到SurfaceHolder變數

        public void surfaceCreated(SurfaceHolder holder) {

            // TODO Auto-generated method stub

   holder = this.getHolder();

        }


10 使用SurfaceView出現的崩潰資訊

java.lang.RuntimeException: Could not read input channel file descriptors from parcel.

at android.view.InputChannel.nativeReadFromParcel(Native Method)

at android.view.InputChannel.readFromParcel(InputChannel.java:148)

at android.view.InputChannel$1.createFromParcel(InputChannel.java:39)

at android.view.InputChannel$1.createFromParcel(InputChannel.java:36)

at com.android.internal.view.InputBindResult.<init>(InputBindResult.java:68)

at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:112)

at com.android.internal.view.InputBindResult$1.createFromParcel(InputBindResult.java:109)

at com.android.internal.view.IInputMethodManager$Stub$Proxy.windowGainedFocus(IInputMethodManager.java:735)

at android.view.inputmethod.InputMethodManager.startInputInner(InputMethodManager.java:1232)

at android.view.inputmethod.InputMethodManager.onPostWindowFocus(InputMethodManager.java:1456)

at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3410)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:148)

at android.app.ActivityThread.main(ActivityThread.java:5438)

相關推薦

Android第二 SurfaceView原始碼以及崩潰剖析

1 在eclipse中檢視Android原始碼 假設我們想參看Activity類的原始碼,按著Ctrl鍵,左擊它,現實的結果卻看不到程式碼的,提示的資訊便是“找不到Activity.class檔案”。下載好Android原始碼之後,點選Attached Source,選擇External locatio

Spring入門第二

pri startup span val join can arrays log .org 重用切面表達式 我們有的時候在切面裏面有多個函數,大部分函數的切入點都是一樣的,所以我們可以聲明切入點表達式,來重用。 package logan.study.aop.impl;

第二 Shell的基礎知識

2018042101一、shell介紹1、shell是一個命令解釋器,提供用戶和機器進行交互,每個用戶都可以有自己特定的shell ,2、CentOS7 默認shell為bash,還有zsh,ksh它們有細節上的差異而已,我們可以查下系統中是否存在zsh: yum list |grep zsh bash有哪

C++筆記 第二 物件的銷燬---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第二十二課 物件的銷燬 1.物件的銷燬 生活中的物件都是被初始化後才上市的 生活中的物件被銷燬前會做一些清理工作 問題:C++中如何清理需要銷燬的物件 一般而言,需要銷燬的物

第二預習任務

12.17 Nginx負載均衡 12.18 ssl原理 12.19 生成ssl金鑰對 12.20 Nginx配置ssl 12.21 php-fpm的pool 12.22 php-fpm慢執行日誌 12.23 open_basedir 12.24 php-fpm程序管理 1.

潭州課堂25班:Ph201805201 django 專案 第二 文章主頁 新聞列表頁面滾動載入,輪播圖後臺實現 (課堂筆記)

新建static/js/news/index.js檔案 ,主要用於向後臺傳送請求, // 新建static/js/news/index.js檔案 $(function () { // 新聞列表功能 let $newsLi = $(".news-nav ul li"); let iPa

潭州課堂25班:Ph201805201 django 項目 第二 文章主頁 新聞列表頁面滾動加載,輪播圖後臺實現 (課堂筆記)

後臺 add bubuko 打印 data src mov auth tap 新建static/js/news/index.js文件 ,主要用於向後臺發送請求, // 新建static/js/news/index.js文件 $(function () { // 新

javaweb基礎第二:Listener

寫在前面: 監聽器用的不多,瞭解下就行,畢竟萬一用到了呢。 這課不錄視訊。教程內容我直接複製其他人的,畢竟不是很重要,我也不怎麼用,而且也太簡單了。   教程: Listener(監聽器) 簡介 Listener用於監聽JavaWeb程式中的事件。

Android 使用LitePal操作資料庫(記得閱讀最後面的注意事項哦)

一、LitePal簡介1、(新建專案LitePalTest)正式接觸第一個開源庫---LitePalLitePal是一款開源的Android 資料庫框架,它採用了物件關係對映(ORM)的模式。2、配置LitePal,編輯app/build.gradle檔案,在dependen

學習淘淘商城第二(KindEditor富文字編輯器的使用)

      上節課我們一起學習了怎樣解決KindEditor富文字編輯器上傳圖片的瀏覽器相容性問題,這節課我們一起學習下富文字編輯器與淘淘商城相結合的使用方法。       我們在發表一篇部落格或者微博的時候,都會用到富文字編輯器,因為它提供的功能非常豐富,不僅能寫文字,還

易語言學習第二----尋找程序PID

知識點 1.遍歷程序,尋找符合要求程序的PID  2.自定義函式:定義返回值和引數,結束時呼叫  返回()命令 3.時間處理子程式可以對回車按鍵被按下產生反應 .版本 2 .支援庫 eAPI .程

OpenGL教程翻譯 第二 使用Assimp載入模型

第二十二課 使用Assimp載入模型 背景 到現在為止我們都在使用手動生成的模型。正如你所想的,指明每個頂點的位置和其他屬性有點時候並不是十分方便。對於一個箱子、錐體和簡單平面還好,但是像人們的臉怎麼辦?現實的商業應用和遊戲中,程式中使用模型一般都是

學習筆記第二

作業shell介紹 shell是一個命令解釋器,提供用戶和機器之間的交互。 用戶配置的最後一個段 就是shell 創建的普通的用戶 它的shell是bin bash 每個用戶都可以有自己的shell sentos7 的shell 是bash 除此之外還有 zsh ksh ,用起來和bash 很像,

C++筆記 第二 階構造模式---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第二十七課 二階構造模式 1.建構函式的回顧 關於建構函式 類的建構函式用於物件的初始化 建構函式與類同名並且沒有返回值 建構函式在物件定義時自動被呼叫 2.問題 1

C++筆記 第二 經典問題解析---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第二十四課 經典問題解析二 1.關於析構的疑問 當程式中存在多個物件的時候,如何確定這些物件的析構順序? 單個物件建立時解構函式的呼叫順序 1.呼叫父類的析構過程(後續課程中

菜雞的Java筆記 第二 物件多型性

本次只是圍繞著多型性的概念來進行講解,但是所講解的程式碼與實際的開發幾乎沒有關係,而且多型一定是在繼承性的基礎上才可以操作的,        而本次將使用類繼承的關係來描述多型的性質,實際的開發中不會出現普通類的繼承關係(一個已經完善的類不應該再被繼

22-撩-Java面試寶典-第二

141.Spring AOP是什麼? AOP:面向切面程式設計 AOP技術利用一種稱為“橫切”的技術, 解剖封裝的物件內部, 並將那些影響了多個類的公共行為 封裝到一個可重用模組, 這樣就能減少系統的重複程式碼, 降低模組間的耦合度, 並有利於未來的可操作性和可維護性。 AOP把軟體系統

22-撩大前端-面試寶典-第二

1.mvvm和mvc區別?它和其它框架(jquery)的區別是什麼?哪些場景適合? mvc和mvvm其實區別並不大。 都是一種設計思想。 主要就是mvc中Controller演變成mvvm中的viewModel。 mvvm主要解決了mvc中大量的DOM 操作使頁面渲染效能降低,

Android填坑之旅(第二篇)使用友盟社會化分享的碰到的坑

最近有個專案又要使用分享功能模組,況且之前也整合過,於是乎趁現在專案沒有啟動,就提前預熱了一把,本想著兩個鐘頭搞定,然而儘管之前整合過一次,筆者發現過段時間之後還是像剛剛整合一樣,故寫下這篇博文加以記錄。 1.在使用友盟分享面板的時候出現面板無法彈出,只是

Ng第:支持向量機(Support Vector Machines)(

.com htm 條件 hid cti 無法 技術 add 效果 7 核函數(Kernels) 考慮我們最初在“線性回歸”中提出的問題,特征是房子的面積x,這裏的x是實數,結果y是房子的價格。假設我們從樣本點的分布中看到x和y符合3次曲線,那麽我們希望使用x的三次多項式來逼