作为职场小白,在做android 整机app, Camera和Gallery. 但是对android 网络编程理解不是很深,所以从这篇文章开始我的网络学习之旅。
首先先通过一个例子来看如何下载一张图片的。
本例子使用的是AsyncTask进行异步操作的。
分析步骤:
(1) 如何使用HttpURLConnection进行网络连接
url = new URL("http://f.hiphotos.baidu.com/image/w%3D2048/sign=3b06d28fc91349547e1eef6462769358/d000baa1cd11728b22c9e62ccafcc3cec2fd2cd3.jpg");
huc = (HttpURLConnection) url.openConnection(); //根据url生成的HttpURLConnection对象,此时还没开始连接网络
int code = huc.getResponseCode(); //http状态返回代码
一般常见的状态返回代码为:
404 - 请求的网页不存在
503 - 服务不可用
(2) 如何获得访问网址的资源
InputStream is = huc.getInputStream();
一般使用连接时候,使用huc.connect(); 而getInputStream()中就已经包含了connect()方法,所以此时可省略。
当执行完这句话的时候,图片数据已经保存在输入流中。
(3) 对流进行存储并转化成bitmap进行使用,记得对bitmap进行释放。
if (code == 200) {
InputStream is = huc.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
is.close();
output.close();
byte[] bytes = output.toByteArray();
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
因为代码简单这里就直接上源码了,本来准备输入网址在下载,发现网址太长,就改成了在代码中直接写了。
package com.example.hoperun.myapplication;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 知道固定图片网址,下载图片demo
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText urlText = null;
private ImageView imageView = null;
private Button clickButton = null;
private SearchImageAsyncTask siat = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
urlText = (EditText) findViewById(R.id.urlText);
clickButton = (Button) findViewById(R.id.clickMe);
clickButton.setOnClickListener(this);
imageView = (ImageView) findViewById(R.id.imageView);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.clickMe:
if (!TextUtils.isEmpty(urlText.getText().toString())) {
siat = new SearchImageAsyncTask();
siat.execute(urlText.getText().toString());
} else {
Toast.makeText(MainActivity.this, "请输入网址", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
public class SearchImageAsyncTask extends AsyncTask<String, Void, Bitmap> {
private URL url = null;
private HttpURLConnection huc = null;
Bitmap bitmap = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Bitmap doInBackground(String... strings) {
try {
url = new URL("http://f.hiphotos.baidu.com/image/w%3D2048/sign=3b06d28fc91349547e1eef6462769358/d000baa1cd11728b22c9e62ccafcc3cec2fd2cd3.jpg");
huc = (HttpURLConnection) url.openConnection();
int code = huc.getResponseCode(); //http状态返回代码
if (code == 200) {
InputStream is = huc.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
is.close();
output.close();
byte[] bytes = output.toByteArray();
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap); //给imageview设置资源
}
}
}
第一次写,还不知道预览起来是什么样子,写的不好请见谅,以后会改进。