android网络获取图片,解决输入流异常
网上大多是4.0之前的写法,用那些代码会出现输入流异常。
据说Android4.0以后的版本都要求把网络处理的内容放在子线程中,以免影响(UI)主线程的运行。
由于刚学android,代码写的不好,也不知道有没有其他方法。
代码的UI部分,就是输入框加按钮加ImageView。
不要忘记加权限 android.permission.INTERNET
开整!
public class MainActivity extends Activity {
private EditText et;
private Button bt;
private ImageView image;
MyHandler myHandler ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
bt = (Button) findViewById(R.id.bt);
image = (ImageView) findViewById(R.id.image);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String path = et.getText().toString();
//创建Handler为了存取数据
myHandler = new MyHandler();
//创建子线程
MyThread myThread = new MyThread(path);
new Thread(myThread).start();
}
});
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
byte[] data = bundle.getByteArray("outStream");
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
MainActivity.this.image.setImageBitmap(bitmap);
}
}
class MyThread implements Runnable{
String path;
MyThread(String path){
this.path = path;
}
@Override
public void run() {
try {
ByteArrayOutputStream out = null;
URL url = new URL(path);
HttpURLConnection conn =(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5*1000);
conn.setRequestMethod("GET");
InputStream inputStream = conn.getInputStream();
out = new ByteArrayOutputStream();
int len = 0;
byte[] b = new byte[1024];
while( (len = inputStream.read(b))!=-1){
out.write(b, 0, len);
}
byte[] buffer = out.toByteArray();
Message msg = new Message();
Bundle bundle = new Bundle();// 存放数据
bundle.putByteArray("outStream", buffer);
msg.setData(bundle);
MainActivity.this.myHandler.sendMessage(msg);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "路径错误", Toast.LENGTH_SHORT).show();
}
}
}
}