問題描述: android.os.NetworkOnMainThreadException異常(不要在主執行緒訪問網路資源)
阿新 • • 發佈:2019-01-02
問題描述:
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 final class ButtonListenerEvent implements OnClickListener{ @Override public 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(); } }