1. 程式人生 > >問題描述: android.os.NetworkOnMainThreadException異常(不要在主執行緒訪問網路資源)

問題描述: android.os.NetworkOnMainThreadException異常(不要在主執行緒訪問網路資源)

問題描述:

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();
    }
}