package com.example.asynctask;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private AsyncImageLoader loader;
private ImageView iv;
private ProgressBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
loader = new AsyncImageLoader();
//传入的参数类型由定义类时的第一个type类型确定
loader.execute(R.drawable.a);
}
private void initView() {
iv = (ImageView) findViewById(R.id.image_view);
bar = (ProgressBar) findViewById(R.id.progress_bar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* @author Administrator
* AsyncTask可以直接修改UI,内置handler
* 三种类型的含义:
* Params, the type of the parameters sent to the task upon execution.
* Progress, the type of the progress units published during the background computation.
* Result, the type of the result of the background computation.
*/
private class AsyncImageLoader extends AsyncTask<Integer, Integer, Bitmap> {
@Override
protected void onPreExecute() {
bar.setMax(20);
bar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(Integer... params) {
for(int i=1; i<=20; i++) {
publishProgress(i);//会调用onProgressUpdate方法
try {
new Thread().sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i == 16)
//用于取消加载
cancel(true);
}
if(isCancelled())
return null;
return BitmapFactory.decodeResource(getResources(), params[0]);
}
@Override
protected void onProgressUpdate(Integer... values) {
bar.setProgress(values[0]);
}
@Override
protected void onPostExecute(Bitmap result) {
//result即为doInBackground的返回值
bar.setVisibility(View.GONE);
iv.setImageBitmap(result);
}
}
}
用AsyncTask获取网络数据,源码:
package com.example.asynctask;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity {
//自定义异步加载类
private AsyncImageLoader loader;
private ImageView iv;
private ProgressBar bar;
private TextView tv;
//网络连接的manager
private ConnectivityManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
netCheck();
networkChange();
String url = "http://www.dm123.cn/ecms/d/file/2013-09-16/6615d9c9513c89d2e156908fb0b3193b.jpg";
loader = new AsyncImageLoader();
//传入的参数类型由定义类时的第一个type类型确定
loader.execute(url);
}
//初始化view
private void initView() {
iv = (ImageView) findViewById(R.id.image_view);
bar = (ProgressBar) findViewById(R.id.progress_bar);
tv = (TextView) findViewById(R.id.text_view);
}
//检查网络状态
private void netCheck() {
manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] networkInfos = manager.getAllNetworkInfo();
for(NetworkInfo network : networkInfos) {
System.out.println("the name of the network type: " + network.getTypeName());
//在每次用网络传输东西时都应该先检查网络是否连接
System.out.println("whether network connectivity exists: " + network.isConnected());
System.out.println("whether network connectivity is possible: " + network.isAvailable());
}
}
//当网络状态发生改变时,用receiver接收
private void networkChange() {
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
NetworkInfo mobile = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(mobile.isAvailable() && mobile.isConnected()) {
System.out.println("Mobile可用且已连接");
} else if(wifi.isAvailable() && wifi.isConnected()) {
System.out.println("WiFi可用且已连接");
} else {
System.out.println("网络不可用");
}
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
//注册receiver,当网络状态发生改变时,系统会发出广播
registerReceiver(receiver, filter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* @author Administrator
* AsyncTask可以直接修改UI,内置handler
* 三种类型的含义:
* Params, the type of the parameters sent to the task upon execution.
* Progress, the type of the progress units published during the background computation.
* Result, the type of the result of the background computation.
*/
private class AsyncImageLoader extends AsyncTask<String, Integer, Bitmap> {
@Override
protected void onPreExecute() {
bar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... params) {
URL url = null;
try {
url = new URL(params[0]);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return readBitmap(url);
}
@Override
protected void onProgressUpdate(Integer... values) {
bar.setProgress(values[0]);
}
@Override
protected void onPostExecute(Bitmap result) {
bar.setVisibility(View.GONE);
iv.setImageBitmap(result);
}
//读取图片
private Bitmap readBitmap(URL url) {
Bitmap bitmap = null;
int fileLength = 0, doneLength = 0;
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置连接超时
conn.setConnectTimeout(10000);
//设置读取超时
conn.setReadTimeout(150000);
//设置连接方式
conn.setRequestMethod("GET");
System.out.println("请求码: " + conn.getResponseCode());
//根据请求码判断是否连接成功
if(!(conn.getResponseCode() == HttpURLConnection.HTTP_OK)) {
//如果不成功则加载一个本地图片
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
return bitmap;
}
//把网页文件内容的字节流转换成字符流
InputStream is = conn.getInputStream();
//ByteArrayOutputStream是把内容读到一个byte数组里(即存储到内存中)
//而ByteArrayInputStream是从一个数组里读取内容,返回所读取的值或者读取到一个数组里,
//返回读取的长度
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//得到文件长度
fileLength = conn.getContentLength();
bar.setMax(fileLength);
byte[] buf = new byte[1024 * 1024];
int len = 0;
//记录读取的次数
int num = 0;
while((len = is.read(buf)) != -1) {
bos.write(buf, 0, len);
doneLength +=len;
publishProgress(doneLength);
num ++;
}
System.out.println("读取的次数" + num);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
// byte[] data = bos.toByteArray();
// System.out.println(data.length);
// bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
bitmap = BitmapFactory.decodeStream(bis);
is.close();
} catch (IOException e) {
System.out.println("网络连接失败!");
e.printStackTrace();
}
return bitmap;
}
//读取html文件
private String readHtml(URL url) {
File file = new File(Environment.getExternalStorageDirectory(), "net.html");
if(!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
System.out.println("文件创建失败");
e.printStackTrace();
}
}
StringBuilder builder = new StringBuilder();
int fileLength = 0, doneLength = 0;
try {
// Writer writer = new PrintWriter(new FileOutputStream(file));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置连接超时
conn.setConnectTimeout(10000);
//设置读取超时
conn.setReadTimeout(150000);
//设置连接方式
conn.setRequestMethod("GET");
System.out.println("请求码: " + conn.getResponseCode());
//把网页文件内容的字节流转换成字符流
Reader reader = new InputStreamReader(conn.getInputStream());
fileLength = conn.getContentLength();
bar.setMax(fileLength);
char[] buf = new char[1024 * 1024];
int len = 0;
while((len = reader.read(buf)) != -1) {
// writer.write(buf, 0, len);
builder.append(buf);
doneLength +=len;
publishProgress(doneLength);
}
reader.close();
// writer.close();
} catch (IOException e) {
System.out.println("网络连接失败!");
e.printStackTrace();
}
return builder.toString();
}
}
}
网络连接首先要判断有哪些网络可用,然后监听网络状态
网络数据传输用HttpURLConnection,设置各种参数,之后接可以读取网页内容并存储或者展现在UI上
读取的时候,如果是网页则直接用字符流,不用自己再转换流了,如果是图片等用字节流,读取完后转化成相应的类型,(Bitmap可直接接受io流)
2727

被折叠的 条评论
为什么被折叠?



