1)從指定的URL獲取對應的流
既然要獲取網絡資源,那麼首先得有個URL,那麼這裡我首先封裝一個打開URL連接獲取到的InputStream 流,這樣一來無論是圖片資源還是文本文件資源都可以使用該接口方法來獲取流。
該功能主要應用URLConnection和HttpURLConnection來實現,具體實現方案如下:
復制代碼
private InputStream openHttpConnection(String urlString) throws IOException{
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if(!(conn instanceof HttpURLConnection)){
throw new IOException("It is not an HTTP connection");
}
try {
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
} catch (Exception ex) {
Log.v("Networking",ex.getLocalizedMessage());
throw new IOException("Error connecting");
}
return in;
}
復制代碼
(2)封裝了上面的獲取流方法接口後,我們就可以利用上面封裝的方法來獲取並下載相應圖片和文本文件內容了
獲取並下載圖片資源方法:
復制代碼
private Bitmap downloadImage(String url){
Bitmap bitmap = null;
InputStream in = null;
try {
in = openHttpConnection(url);
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.v("NetworkingActivity", e.getLocalizedMessage());
}
return bitmap;
}
復制代碼
獲取並下載文本內容方法:
復制代碼
private String downloadText(String url){
int BUFFER_SIZE = 2000;
InputStream is = null;
try {
is = openHttpConnection(url);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
InputStreamReader isr = new InputStreamReader(is);
int charRead;
String str="";
char[] inputBuffer = new char[BUFFER_SIZE];
try {
while((charRead=isr.read(inputBuffer))>0){
String readString = String.copyValueOf(inputBuffer, 0, charRead);
str += readString;
inputBuffer = new char[BUFFER_SIZE];
}
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
return str;
}
復制代碼
(3)在獲取下載圖片資源和文本內容資源方法都完成後,現在就可以開始下載任務了,為了防止等待效應,一般采用異步任務來下載網絡資源。
對對應的下載資源任務封裝各自的異步下載任務即可。下面就是實現異步下載任務的方案:
異步下載圖片任務:
復制代碼
private class DownloadImageTask extends AsyncTask<String, Bitmap, Long>{
long imagesCount = 0;
ProgressBar progressBar;
public DownloadImageTask(ProgressBar pBar){
this.progressBar = pBar;
}
@Override
protected Long doInBackground(String... urls) {
// TODO Auto-generated method stub
for(int i = 0; i < urls.length;i++){
Bitmap imageDownloaded = downloadImage(urls[i]);
if(imageDownloaded!=null){
imagesCount ++;
publishProgress(imageDownloaded);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return imagesCount;
}
//display the image downloaded
@Override
protected void onProgressUpdate(Bitmap... bitmaps) {
// TODO Auto-generated method stub
ivImg.setImageBitmap(bitmaps[0]);
progressBar.setProgress((int) imagesCount*10);
}
//when all the images have been downloaded
@Override
protected void onPostExecute(Long imageDownloaded) {
// TODO Auto-generated method stub
String str = "下載完成!一共下載了"+imagesCount +"張圖片";
Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show();
}
}
復制代碼
異步下載文本文件內容任務:
復制代碼
private class DownloadTextTask extends AsyncTask<String, Void, String>{
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
Toast.makeText(getBaseContext(), result, Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(String... urls) {
// TODO Auto-generated method stub
return downloadText(urls[0]);
}
}
復制代碼
這樣一來,異步下載網絡資源就完成了。
下面為了讀者方便測試,下面提供本文實例代碼中的相關網絡資源URL,以方便大家自己測試使用。其余非核心代碼就不在貼出來,望讀者見諒。
復制代碼
//圖片下載URLs
private String[] mUrl =
{
"http://images.cnitblog.com/i/322919/201405/181111308592436.png",
"http://images.cnitblog.com/i/322919/201405/181111385003770.png",
"http://images.cnitblog.com/i/322919/201405/181111493901865.png",
"http://images.cnitblog.com/i/322919/201405/181111550463327.png",
"http://images.cnitblog.com/i/322919/201405/181117587961455.png",
"http://images.cnitblog.com/i/322919/201405/181118041251414.png",
"http://images.cnitblog.com/i/322919/201405/181119313754936.png",
"http://images.cnitblog.com/i/322919/201405/181119357816682.png",
"http://images.cnitblog.com/i/322919/201405/181119458753432.png",
"http://images.cnitblog.com/i/322919/201405/181119499372608.png",
"http://images.cnitblog.com/i/322919/201405/181120173901329.png",
"http://images.cnitblog.com/i/322919/201405/181120244849561.png",
"http://images.cnitblog.com/i/322919/201405/181120357812013.png",
"http://images.cnitblog.com/i/322919/201405/181120398596959.png"
};
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setMax(mUrl.length*10);
progressBar.setVisibility(View.VISIBLE);
//異步下載圖片任務
DownloadImageTask task = new DownloadImageTask(progressBar);
task.execute(mUrl);
//文本文件URL
String strUrl = "http://www.sogou.com/docs/about.htm";
//異步下載文本文件內容任務
new DownloadTextTask().execute(strUrl);