菜鳥學android——容易引起程序崩潰的幾個點(持續更新中)

最近在做一個項目,分享一下遇到的bug吧,算是比較常見:

1、handler——thread

問題:在thread中用handler發送消息,當程序退出時,thread不會立即終止。這時如果在thread中發送message,可能因爲handler爲null導致程序崩潰。

解決方案:將發送消息的代碼放到try——catch當中,或者監察handler是否爲空。

2、在thread中更新List的data數據

問題:我在thread中更新data數據,然後在handler中調用adapter.notifyDataSetChanged()方法,大部分時候不會有問題,但是偶爾會崩潰。

解決方案:在thread中更新一個臨時的tempData數據,然後在handler中執行data = tempData,adapter.notifyDataSetChanged()。

3、OOM

在處理很多圖片時,經常會遇到內存溢出的問題,可以在加載圖片時判斷一下圖片的尺寸,過大的話就縮小後再加載,如下:

try {
			URLConnection conn = new URL(url).openConnection();
			conn.setConnectTimeout(CONNECT_TIMEOUT);
			conn.setReadTimeout(READ_TIMEOUT);
			InputStream is = (InputStream) conn.getContent();
//			bitmap = BitmapFactory
//					.decodeStream(is);
			// 對圖像的大小進行處理
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			byte[] buffer = new byte[1024];
			int length = -1;
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			while ((length = is.read(buffer)) != -1) {
				byteArrayOutputStream.write(buffer, 0, length);
			}
			byteArrayOutputStream.close();
			byte[] newbuffer = byteArrayOutputStream.toByteArray();
			length = newbuffer.length;
			BitmapFactory.decodeByteArray(newbuffer, 0, length, options);
			int scalew = (int) (options.outWidth / 200.0);
			int scaleh = (int) (options.outHeight / 200.0);
			options.inSampleSize = Math.max(scalew, scaleh) + 1;
			// 獲取圖像
			options.inJustDecodeBounds = false;
			options.inInputShareable = true;
			options.inPurgeable = true;
			bitmap = BitmapFactory.decodeByteArray(newbuffer, 0, length, options);
			is.close();
		} catch (Exception e) {
			Log.e("WebImage", "getBitmapFromUrl");
			e.printStackTrace();
		}

4、日期轉換

這個不會引起崩潰,但卻得不到正確結果。看問題吧:

拿到一個時間戳,想對齊進行自定義的格式化。分爲——剛剛,X分鐘前,X小時X分鐘前,X天前,X個月前,然後就是X年X月X日了。。。

看其中一段代碼吧:

else if(tempTime < 1000 * 60 * 60 * 24 * 30) {
			//小於1個月
			strTime = tempTime / (1000 * 60 * 60 * 24) + "天前";
		}

這段代碼看起來很合理,但卻得不到正確結果!!原因就是1000 * 60 * 60 * 24 * 30得到的是個負值!!相信大家已經知道原因了,這個值超過了int所能表示的最大值。

正確代碼爲:

else if(tempTime < 1000l * 60 * 60 * 24 * 30) {//此處注意要將int轉換爲long
			//小於1個月
			strTime = tempTime / (1000l * 60 * 60 * 24) + "天前";
		}
這麼長時間第一次遇到這種值溢出的錯誤,當給自己一個提醒吧。


5、java.lang.ClassCastException

出現這個錯誤一般都是我們重新調整了xml文件中控件的位置。

解決方法是清理一下工程。project->clean

發佈了29 篇原創文章 · 獲贊 14 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章