获取网络图片更新ui

来源:互联网 发布:2010年流行的网络歌曲 编辑:程序博客网 时间:2024/06/05 09:42

ThreadHandlerActivity.java

package com.lxf;
import com.lxf.ImageService;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;


import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;


import android.widget.Toast;


public class ThreadHandlerActivity extends Activity {
    /** Called when the activity is first created. */

private static final int MSG_SUCCESS = 0;//
private static final int MSG_FAILURE = 1;//

private ImageView mImageView;
private Button mButton;

private Thread mThread;

private Handler mHandler = new Handler() {
public void handleMessage (Message msg) {//此方法在ui线程运行
switch(msg.what) {
case MSG_SUCCESS:
mImageView.setImageBitmap((Bitmap) msg.obj);//imageview显示从网络获取到的logo
Toast.makeText(getApplication(), getApplication().getString(R.string.get_pic_success), Toast.LENGTH_LONG).show();
break;


case MSG_FAILURE:
Toast.makeText(getApplication(), getApplication().getString(R.string.get_pic_failure), Toast.LENGTH_LONG).show();
break;
}
}
};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mImageView= (ImageView) findViewById(R.id.imageView);
        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if(mThread == null) {
mThread = new Thread(runnable);
mThread.start();
}
else {
Toast.makeText(getApplication(), getApplication().getString(R.string.thread_started), Toast.LENGTH_LONG).show();
}
}
});
    }
    
    Runnable runnable = new Runnable() {

@Override
public void run() {   //run()在新的线程中运行

final Bitmap bm;
try {
byte[] data = ImageService.getImage("http://www.baidu.com/img/baidu_sylogo1.gif");
bm = BitmapFactory.decodeByteArray(data, 0, data.length);
} catch (Exception e) {
mHandler.obtainMessage(MSG_FAILURE).sendToTarget();//获取图片失败
return;
}
mHandler.obtainMessage(MSG_SUCCESS,bm).sendToTarget();//获取图片成功,向ui线程发送MSG_SUCCESS消息和bitmap对象


// mImageView.setImageBitmap(bm); //出错!不能在非ui线程操作ui元素


// mImageView.post(new Runnable() {//另外一种更简洁的发送消息给ui线程的方法。
//
// @Override
// public void run() {//run()方法会在ui线程执行
// mImageView.setImageBitmap(bm);
// }
// });
}
};

}

下面的是获取图片的二进制数据

ImageService.java

package com.lxf;


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


import com.lxf.StreamTool;


public class ImageService {

public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
return StreamTool.readInputStream(inStream);//得到图片的二进制数据
}


}


StreamTool.java


package com.lxf;


import java.io.ByteArrayOutputStream;
import java.io.InputStream;


public class StreamTool {


/**
* 从输入流中获取数据
* @param inStream 输入流
* @return
* @throws Exception
*/
public static byte[] readInputStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1 ){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}

原创粉丝点击