Android運行Socket項目時出現錯誤 Error: ShouldNotReachHere() – Android移動開發技術文章_手機開發 Android移動開發教學課程

在Android項目中實現Socket通信,服務器端使用main方法創建ServerSocket,運行啟動服務器時報錯“Error: ShouldNotReachHere() ”。
原因分析:java中使用main函數作為應用程序的接口,class的生命周期始於main方法,終於main方法。Android雖然使用的是java語法,但是卻不使用main作為程序入口,一個activity啟動時要經過onCreate()方法、onStart()方法和onResume()方法才算完全啟動,而且這些方法都是自動調用的,這是與java application運行的最大不同處。所以如果你新建的是Android Project,那麼程序默認使用的就是android.jar來作為程序運行時環境,但是由於我們按照慣例將服務器端ServerSocket的啟動放在main方法中,android無法解析,所以會報出“Error: ShouldNotReachHere() ”錯誤,就是說程序永遠不會執行到這裡,這種錯誤平時也常見,比如說你在定義瞭一條return語句後又在後面加上一句System.out.println("xxxx")一樣,return表示程序已經結束,後面那句System是永遠無法執行的,因為按照java語法程序無法被解析。
解決方案一:隔離服務器端和客戶端。將服務器端ServerSocket的創建移到Android項目之外的一個Java Project中,先運行這個Java Project,啟動ServerSocket,再運行客戶端所在的Android Project。
解決方案二:更改服務器端運行時環境。將ServerSocket依舊寫在Java類中的main方法中,在IDE左邊的Package Exployer中選中項目,點擊鼠標右鍵,選擇“Run as——>Run configuration”,在彈出窗口的左邊框內找到“Java application——>ServerSocket類”,在右邊框內找到Classpath選項,找到其中的Bootstrap Entries,選中其中的android.jar,點擊右邊remove按鈕將其刪除,然後點擊Advanced按鈕,選擇Add Libaby選項,點擊ok按鈕,在彈出的對話框中選擇JRE System Library,點擊“next”按鈕,選擇Workplace Default JRE選項,點擊“finish”按鈕即可完成配置。
解決方案三:使用Android中的Activity創建服務器ServerSocket。這種方案應該將服務器和客戶端都寫在同一個Activity中的不同方法中,先啟動服務器方法,再啟動客戶端方法。這是因為Android中一個Activity就代表瞭一個屏幕,如果你將服務器和客戶端寫在不同的Activity中,先啟動服務器Activity,再跳轉到客戶端Activity,那麼服務器Activity就會執行onPause()回調方法,相當於關閉Socket服務器瞭。
解決方案四:使用Android中的Service創建服務器ServerSocket。創建一個Service用來存放Socket服務器代碼,再創建一個Activity來存放Socket客戶端代碼和顯示通信信息。運行時先通過Activity啟動Service,再啟動客戶端代碼的Activity。由於Android中的Service是後臺運行,所以即使跳轉Activity也不會關閉服務。
這四種方案中,第一種將服務器和客戶端分隔在不同項目中,不利於管理;第三種方案將客戶端和服務器代碼寫在同一個類中,顯得雜亂而且不符合實際情況。個人覺得可取的是第二種和第四種方案,特別是第四種方案。第二種方案夾雜瞭Android和Java環境處理,第四種方案則是純粹的Android應用,而且用到瞭Android中的Service,“Service——Activity”更符合Socket的“服務器——客戶端”模式。
 

作者 “翠竹軒”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。