需求:使用AsyncTask异步任务,下载网络图片
一、在主线程中操作耗时任务会导致异常
因为在新版Android平台不允许直接在UI线程中建立网络连接、访问网络资源。在UI线程中操作耗时任务(访问网络),将会导致 android.os.NetworkOnMainThreadException异常。
1、在AndroidManifest.xml中添加网络授权
<uses-permission android:name="android.permission.INTERNET"/>
2、新版Android平台取消了对HttpClient的支持,需要在Gradle Scripts--->build.gradle中添加下面一句话
useLibrary 'org.apache.http.legacy'
3、MainActivity代码实现
package com.example.zhaoyc.asynctaskdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button button;
private ImageView imageView;
private String img_path = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
imageView = (ImageView)findViewById(R.id.imageView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//不能在UI的主线程里面访问网络,会导致异常
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(img_path);
try {
httpClient.execute(httpGet);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
4、运行后点击Button,抛出异常
二、使用AsyncTask处理耗时任务
1、MainActivity代码实现
package com.example.zhaoyc.asynctaskdemo;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button button;
private ImageView imageView;
private String img_path = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
imageView = (ImageView)findViewById(R.id.imageView);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("提示信息");
progressDialog.setMessage("正在下载,请稍候...");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//执行异步任务的操作
new MyTask().execute(img_path);
}
});
}
/**
* 使用异步任务的规则:
* 1、声明一个类继承AsyncTask,标注三个参数
* 第一个参数表示要执行的任务,通常是网络的路径;
* 第二个参数表示进度的刻度;
* 第三个参数表示任务的返回结果
*/
public class MyTask extends AsyncTask<String,Void,Bitmap>{
//表示任务执行之前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
//主要是完成耗时操作
@Override
protected Bitmap doInBackground(String... params) {
//使用网络连接类HttpClient类完成对网络数据的提取
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
Bitmap bitmap = null;
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode()==200){
HttpEntity httpEntity = httpResponse.getEntity();
byte[] data = EntityUtils.toByteArray(httpEntity);
bitmap = BitmapFactory.decodeByteArray(data,0,data.length);
}
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
//主要是更新UI操作
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap);
progressDialog.dismiss();
}
}
}
2、运行结果