標籤:
問題描述:
android.os.NetworkOnMainThreadException異常(不要在主線程訪問網路資源)
問題分析:
造成這種異常的原因是安卓版本問題(仔細研究錯誤原因是代碼不符合Android規範),網上搜尋發現:android3.0版本開始(具體是不是從這個版本開始的,就不深究咯)就強製程序不能在主線程中訪問網路,要把訪問網路放在獨立的線程中。
解決方式:
1、想要忽略這些強制策略問題的話,可以在onCreate()方法裡面加上
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
2、放在單獨的線程中:(我用的是點擊按鈕查看網狀圖片,學慣用)
private Bitmap bitmap = null;//全域變數 (我如果放在局部變數中,會提示:不可變的局部變數不能被賦值,懶省事就放到全域變數中咯)
按鈕監聽器:
private final class ButtonListenerEvent implements OnClickListener{@Overridepublic void onClick(View v) { final String path = imagePath.getText().toString(); final Handler handler = new Handler(){ public void handleMessage(Message msg){ switch (msg.what) { case 0: imageView.setImageBitmap(bitmap); break; default: break; } }};new Thread(){ public void run(){ try { byte[] data = ImageService.getImage(path); // 設定映像的位元影像 bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); //處理完髮送一個空訊息 handler.sendEmptyMessage(0); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(getApplicationContext(), R.string.error, 1) .show(); } } }.start(); }}
我是安卓新手,如果有不對的地方還請大家多多指導~
安卓問題總結( android.os.NetworkOnMainThreadException異常)