Android Bitmap求解

小弟剛剛開始就成日逾到RUNTIME ERROR
GOOGLE左幾日,有無高手可以幫幫小弟。
其實我都係想係網頁拎張圖出黎全螢幕

package com.imageviewer;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class MainActivity extends Activity {
       
        String imageUrl01 = "http://cdn3.vox-cdn.com/uploads/chorus_asset/file/917470/iphone-6-travel-photo-review-mann-header.0.jpg";
        Bitmap bmImg;
        ImageView im01;
       
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        
        im01 = (ImageView)findViewById(R.id.im01);
        im01.setImageBitmap(returnBitMap((imageUrl01)));
    }

    public Bitmap returnBitMap(String url) {
        URL myFileUrl = null;   
        Bitmap bitmap = null;   
        try {   
            myFileUrl = new URL(url);   
           }
        catch (MalformedURLException e) {   
            e.printStackTrace();   
           }   
        try {   
            HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();   
            conn.setDoInput(true);   
            conn.connect();   
            InputStream is = conn.getInputStream();   
            bitmap = BitmapFactory.decodeStream(is);   
            is.close();   
           }
        catch (IOException e) {   
            e.printStackTrace();   
           }   
        return bitmap;

    }

}

本帖最後由 Charcoal99 於 2015-4-19 14:37 編輯

首先, 假設你在AndroidManifest 已經有INTERNET permission, 否則萬事皆休。

其次, 你個Code基本上冇錯, 在版本9或之前都可正常跑,
但你的 code 在UI-thread 裡面 訪問了耗時及阻塞性的network處理,
引起時間不確定性, 及影響到UI的流暢度,
Android 在版本10之後決定禁止這樣做, 更建議開發者啟動另一線程(thread) 來處理它
(方法有多種, 如 AsyncTask)。

第三, 在AndroidManifest 將minSdkVersion及targetSdkVersion設定為9或以下, 你的Code 便能跑,
你也可在版本10之後用代碼在runtime時暫時避開上述這條規則 , 使它能走下去。
在setContentView() 之後加上這一句:
  1.     if(android.os.Build.VERSION.SDK_INT > 9)
  2.         StrictMode.setThreadPolicy((new android.os.StrictMode.ThreadPolicy.Builder()).permitAll().build());
複製代碼
以上(第三) 只是 for learning purpose, 不要作為解決方案, 否則會學壞手勢。
參考官方文件 http://developer.android.com/gui ... es-and-threads.html 的 Threads 段,
兩個單線程模型重要原則。

TOP

回覆 2# Charcoal99


多謝師兄
好詳細呀

TOP

O係UI thread搞network 野不是一個專業programmer所為

TOP