http://lcd.yesky.com/imagelist/2009/315/qwm3qsg1r0l9.jpg 這張網狀圖片非常大,如果直接用BitmapFactory.decodeStream(new URL(url).openStream())的話就會出現OOM問題,採用以下方法可以有效解決此問題的發生
package com.test.bitmap;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.widget.ImageView;import android.widget.Toast;public class BitmapDemoActivity extends Activity { /** Called when the activity is first created. */private ImageView iv;private Handler mhanHandler=new Handler(){public void handleMessage(android.os.Message msg) {iv.setImageBitmap((Bitmap)msg.obj);};}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //http://lcd.yesky.com/imagelist/2009/315/qwm3qsg1r0l9.jpg iv=(ImageView) findViewById(R.id.img); final String url="http://lcd.yesky.com/imagelist/2009/315/qwm3qsg1r0l9.jpg"; new Thread (){ public void run() { try {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeStream(new URL(url).openStream(),null,options); int width=options.outWidth, height=options.outHeight;int scale=1;int temp=width>height?width:height;while(true){ if(temp/2<120) break; temp=temp/2; scale*=2;}BitmapFactory.Options opt = new BitmapFactory.Options();opt.inSampleSize=scale;Bitmap bitmap= BitmapFactory.decodeStream(new URL(url).openStream(), null, opt);Message msg=mhanHandler.obtainMessage();msg.obj=bitmap;mhanHandler.sendMessage(msg);} catch (Exception e) {e.printStackTrace();} }; }.start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.login: Toast.makeText(this, "login", 0).show(); return true; case R.id.regist: Toast.makeText(this, "regist", 0).show(); return true; case R.id.about: Toast.makeText(this, "about", 0).show(); return true; case R.id.exit: Toast.makeText(this, "exit", 0).show(); return true; default: return super.onOptionsItemSelected(item); } }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ic_launcher" /></LinearLayout>