安卓問題總結( android.os.NetworkOnMainThreadException異常)

問題描述:java

android.os.NetworkOnMainThreadException異常(不要在主線程訪問網絡資源)

問題分析:android

形成這種異常的緣由是安卓版本問題(仔細研究錯誤緣由是代碼不符合Android規範),網上搜索發現:android3.0版本開始(具體是否是從這個版本開始的,就不深究咯)就強制程序不能在主線程中訪問網絡,要把訪問網絡放在獨立的線程中。網絡

解決方式:ide

一、想要忽略這些強制策略問題的話,能夠在onCreate()方法裏面加上學習

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()ui

.detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());spa

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()線程

.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()code

.penaltyLog().penaltyDeath().build());圖片

二、放在單獨的線程中:(我用的是點擊按鈕查看網絡圖片,學習用)

private Bitmap bitmap = null;//全局變量 (我若是放在局部變量中,會提示:不可變的局部變量不能被賦值,懶省事就放到全局變量中咯

按鈕監聽器:

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

我是安卓新手,若是有不對的地方還請你們多多指導~

相關文章
相關標籤/搜索