请教一个android ,handle的问题,下面的代码运行有问题package com.neusoft.xmlresource;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;import android.app.Activity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.widget.ImageView;public class MainActivity extends Activity { ImageView mImageView = null;

Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
InputStream in = null;
FileOutputStream out = null;

try {
request.setURI(new URI("http://192.168.1.180/images/1.png"));
HttpResponse response = client.execute(request);
out = new FileOutputStream("/mnt/sdcard/1.png");
in = response.getEntity().getContent();
byte[] buffer=new byte[1024];
for(int len=0;(len=in.read(buffer))!=-1;){
out.write(buffer,0,len);
}

} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.flush();
in.close();
out.close();
} catch (IOException e) {

e.printStackTrace();
}

}

}



};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mImageView = (ImageView)findViewById(R.id.imageView);
handler.sendEmptyMessage(1);

/*
new Thread(new Runnable(){

@Override
public void run(){
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
InputStream in = null;
FileOutputStream out = null;
try {
request.setURI(new URI("http://192.168.1.180/images/1.png"));
HttpResponse response = client.execute(request);
out = new FileOutputStream("/mnt/sdcard/1.png");
in = response.getEntity().getContent();
byte[] buffer=new byte[1024];
for(int len=0;(len=in.read(buffer))!=-1;){
out.write(buffer,0,len);
}

} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.flush();
in.close();
out.close();
} catch (IOException e) {

e.printStackTrace();
}

}
}

}).start();*/

mImageView.setImageURI(Uri.fromFile(new File("/mnt/sdcard/1.png")));



} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}
什么原因呢?
如果不用handler,改用下面的执行,则没有问题。 new Thread(new Runnable(){

@Override
public void run(){
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
InputStream in = null;
FileOutputStream out = null;
try {
request.setURI(new URI("http://192.168.1.180/images/1.png"));
HttpResponse response = client.execute(request);
out = new FileOutputStream("/mnt/sdcard/1.png");
in = response.getEntity().getContent();
byte[] buffer=new byte[1024];
for(int len=0;(len=in.read(buffer))!=-1;){
out.write(buffer,0,len);
}

} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
out.flush();
in.close();
out.close();
} catch (IOException e) {

e.printStackTrace();
}

}
}

}).start();
这是什么原因,诸位老师给分析一下。
android  多线程

解决方案 »

  1. handler的代码执行是在UI主线程中执行的
    其中又带有网络连接这种耗时操作正确的做法就是在oncreate中启动线程去获取图片,成功后发送message,在handler中给imageview设置图片
      

  2. 在主线程new 一个handler,同时重写handlermessage ,使用这个handler的实例post一个runable,在runable里放入需要执行的操作,当完成的时候sendmessage,然后就可以在handlermessage中处理了
      

类似问题 »