在應用app的時候,我們常常會遇到app閃退各類的問題。
那麼怎麼解決和分析,以及處理這些問題,我在這裡列舉幾個常見的app閃退的問題,並希望大家可以通過這幾類分析,儘量避免app閃退這樣的大問題。
第一點,網絡數據的請求和保護,在app進行網絡切換的時候,如果沒有做好網絡保護,是會出現app閃退問題的,所以,在網絡請求類中,設置好網絡的斷網保護,就可以解決這類問題了
Android應用程式中用Broadcast來監測"斷網",並進行相應處理
public class ConnectionChangeReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return;
}
}
}
}
SharedPreferences settings = context.getSharedPreferences(
Constant.PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(Constant.PREFS_NETWORK_ONLINE, false);
editor.commit();
intent.setClass(context, NetworkListActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
第二點,主線程的死鎖
一般造成死鎖必須同時滿足如下4個條件:
1,互斥條件:線程使用的資源必須至少有一個是不能共享的;
2,請求與保持條件:至少有一個線程必須持有一個資源並且正在等待獲取一個當前被其它線程持有的資源;
3,非剝奪條件:分配資源不能從相應的線程中被強制剝奪;
4,循環等待條件:第一個線程等待其它線程,後者又在等待第一個線程。
因為要產生死鎖,這4個條件必須同時滿足,所以要防止死鎖的話,只需要破壞其中一個條件即可。
第三點,數據安全保護,在數據和網絡伺服器之間進行交互的時候,伺服器返回的空類型有多種多樣類型,可以為null,也可以為空類型加nukl,可以有空格等,所以,在做好空值處理的時候,需要考慮多種情況,如果空值判斷不好,也是會出現閃退問題的,再者就是最好在數據處理的時候,添加空值判斷
第四點,數據的返回,做安全判斷,在伺服器對接的時候,如果數據處理沒有做好,返回回調的數據安全判斷,也是會出現閃退問題
第五點,野指針或者內存洩露,這個就需要啟用Zombie Object進行懸掛指針的檢測。
或者 應用Product -> Analysis進行內存洩露的初步檢測。
也 可以在xcode的build setting中打開implicit retain of 『self』 within blocks,xcode編譯器會給出警告,逐個排查警告。
抑或 應用Leak Instrument進行內存洩露查找。
在以上方法不奏效的情況下,通過查看dealloc是否調用查看某個class是否洩露的問題
-