Android開(kāi)發(fā)之異步獲取并下載網(wǎng)絡(luò)資源

字號(hào):


    1)從指定的URL獲取對(duì)應(yīng)的流
    既然要獲取網(wǎng)絡(luò)資源,那么首先得有個(gè)URL,那么這里我首先封裝一個(gè)打開(kāi)URL連接獲取到的InputStream 流,這樣一來(lái)無(wú)論是圖片資源還是文本文件資源都可以使用該接口方法來(lái)獲取流。
    該功能主要應(yīng)用URLConnection和HttpURLConnection來(lái)實(shí)現(xiàn),具體實(shí)現(xiàn)方案如下:
    代碼如下:
    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)封裝了上面的獲取流方法接口后,我們就可以利用上面封裝的方法來(lái)獲取并下載相應(yīng)圖片和文本文件內(nèi)容了
    獲取并下載圖片資源方法:
    代碼如下:
    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;
    }
    代碼如下:
    獲取并下載文本內(nèi)容方法:
    代碼如下:
    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)在獲取下載圖片資源和文本內(nèi)容資源方法都完成后,現(xiàn)在就可以開(kāi)始下載任務(wù)了,為了防止等待效應(yīng),一般采用異步任務(wù)來(lái)下載網(wǎng)絡(luò)資源。
    對(duì)對(duì)應(yīng)的下載資源任務(wù)封裝各自的異步下載任務(wù)即可。下面就是實(shí)現(xiàn)異步下載任務(wù)的方案:
    異步下載圖片任務(wù):
    代碼如下:
    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();
    }
    }
    代碼如下:
    異步下載文本文件內(nèi)容任務(wù):
    代碼如下:
    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]);
    }
    }
    代碼如下:
    這樣一來(lái),異步下載網(wǎng)絡(luò)資源就完成了。
    下面為了讀者方便測(cè)試,下面提供本文實(shí)例代碼中的相關(guān)網(wǎng)絡(luò)資源URL,以方便大家自己測(cè)試使用。其余非核心代碼就不在貼出來(lái),望讀者見(jiàn)諒。
    代碼如下:
    //圖片下載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);
    //異步下載圖片任務(wù)
    DownloadImageTask task = new DownloadImageTask(progressBar);
    task.execute(mUrl);
    //文本文件URL
    String strUrl = "http://www.sogou.com/docs/about.htm";
    //異步下載文本文件內(nèi)容任務(wù)
    new DownloadTextTask().execute(strUrl);