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();
  }
  }
}

}

posted @ 2014-06-10 22:35  专属坑儿  阅读(644)  评论(0编辑  收藏  举报