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>