1、布局activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="5dp"
android:paddingRight="5dp" >
<EditText
android:id="@id/ed_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入图片地址"/>
<Button
android:id="@+id/btnLoadImg"
android:layout_marginTop="10dp"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载网络图片" >
</Button>
</LinearLayout>
布局Image.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<ProgressBar
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone"
/>
<TextView
android:id="@+id/mTextprogress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="15%"
android:layout_centerInParent="true"
android:textSize="13sp"
/>
</RelativeLayout>
2、Mainactivity.java
package com.example.asynctaskdemo;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.os.Build;
import android.provider.ContactsContract.CommonDataKinds.Im;
/**
* AsyncTask异步任务执行
*/
public class MainActivity extends Activity implements OnClickListener{
private Button mBtnLoadImg;
private EditText ed_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mBtnLoadImg=(Button)findViewById(R.id.btnLoadImg);
ed_text=(EditText)findViewById(R.id.ed_text);
mBtnLoadImg.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String Uri=ed_text.getText().toString();
Intent intent=new Intent(MainActivity.this, ImageTest.class);
intent.putExtra("Uri", Uri);
startActivity(intent);
}
}
3、ImageTest.java
package com.example.asynctaskdemo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* 显示一张网络图片
*/
public class ImageTest extends Activity {
private String TAG = "ImageTest.class";
private ImageView mImageView;
private ProgressBar mProgressBar;
private TextView mTextProgress;
private MyAsyncTaskShowImg mTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String UriString=bundle.getString("Uri");
Log.d("URI", UriString);
initView();
mTask = new MyAsyncTaskShowImg();
mTask.execute(UriString);
}
private void initView() {
mTextProgress = (TextView) findViewById(R.id.mTextprogress);
mImageView = (ImageView) findViewById(R.id.imageView1);
mProgressBar = (ProgressBar) findViewById(R.id.progress);
}
class MyAsyncTaskShowImg extends AsyncTask<String, Integer, Bitmap> {
/**
* 初始化UI控件
*
* @see android.os.AsyncTask#onPreExecute()
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressBar.setVisibility(View.VISIBLE);
mTextProgress.setText("0%");
}
/**
* 执行复杂的耗时任务
*
* @param params
* @return
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Bitmap doInBackground(String... params) {
// 获取网络中图片的地址
String mImgUrl = params[0];
String mFileName = "temp_pic";
Log.d(TAG, "mImgUrl is " + mImgUrl);
// 网络中图片最终将转化为bitmap类型返回给imageview显示
Bitmap mBitmap = null;
// 获取数据的输入流
InputStream is = null;
OutputStream out = null;
HttpURLConnection connection;
try {
// 将网络图片地址以流的方式转化为bitmap类型
connection = (HttpURLConnection) new URL(mImgUrl).openConnection();
connection.setDoInput(true);
connection.setDoOutput(false);
// 设置链接超时时间
connection.setConnectTimeout(10 * 1000);
//从网络数据得到输入流 及得到图片信息
is = connection.getInputStream();
//打开文件,将数据写进输出流中
out = openFileOutput(mFileName, MODE_PRIVATE);
byte[] data = new byte[1024];
// 每次读到的长度
int seg = 0;
// 总得数据大小
long totalSize = connection.getContentLength();
Log.d(TAG, "total size is " + totalSize);
// 现在的进度
long current = 0;
//从网络中读取数据
while ((seg = is.read(data)) != -1) {
// 当前总的进度
current += seg;
Log.d(TAG, "current size is " + current);
// 下载百分比
int progress = (int) ((float) current / totalSize * 100);
Log.d(TAG, "progress size is " + progress);
// 通知更新进度
publishProgress(progress);
out.write(data, 0, seg);
}
mBitmap = BitmapFactory.decodeFile(getFileStreamPath(mFileName).getAbsolutePath());
Log.d(TAG, "file is " + getFileStreamPath(mFileName).getAbsolutePath());
connection.disconnect();
is.close();
out.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mBitmap;
}
/**
* 显示从网络中加载图片的进度
*
* @param values
* @see android.os.AsyncTask#onProgressUpdate(Progress[])
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mTextProgress.setText(values[0] + "%");
}
/**
* 将doInBackground中执行的结果返回给该方法,用于更新UI控件
*
* @param result
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
mProgressBar.setVisibility(View.GONE);
mTextProgress.setVisibility(View.GONE);
mImageView.setImageBitmap(result);
Toast.makeText(ImageTest.this, "图片加载完成.", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPause() {
super.onPause();
if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) {
//cancel方法只是将AsyncTask对应的状态标记为cancel状态,不是真的取消
mTask.cancel(true);
}
}
}