Android開發-下載網絡圖片並顯示到本地


Android下載網絡圖片的流程是:

發送網絡請求->將圖片以流的形式下載下來->將流轉換為Bitmap並賦給ImageView控件。

注意點

  • 最新的Android系統不可以在主線程上請求網絡,需要使用線程來請求
  • 下載圖片屬於耗時任務,最優做法是放在一個AsyncTask中操作

設計思路

1.網絡請求:該例中需要下載的文件類型是圖片類型,可以將網絡請求獲取的數據類型轉換為Bitmap已供ImageView直接使用,但是一個合理的網絡請求類的設計是將下載的數據類型轉換為最基本的InputStream,這樣不管是下載圖片,音頻,文本還是視頻,都可以將結果拋出去讓上層的邏輯來處理。
2.異步請求:下載圖片,網絡下載屬於耗時操作,所以需要封裝一個AsyncTask來處理網絡請求,該請求繼承自Runnable接口。
3.異步回調:前台需要通過回調的方式來得到圖片源,並將該圖片源賦值給ImageView.

相關代碼

NetService:網絡請求服務類
public class NetService {
public static InputStream getInputStreamByUrl(String address){
URL url = null;
HttpURLConnection urlConnection = null;
try {
url = new URL(address);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setConnectTimeout(2 * 1000);
urlConnection.setRequestMethod("GET");
return urlConnection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

NetServiceTask:AsyncTask類
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

import java.io.BufferedInputStream;
import java.io.InputStream;

public class NetServiceTask extends AsyncTask<String, Void, Bitmap> implements Runnable{
private String address;
private URLPostHandler urlPostHandler = null;

public NetServiceTask(String address, URLPostHandler urlPostHandler) {
    this.address=address;
    this.urlPostHandler=urlPostHandler;
}

/**
 * 表示任務執行之前的操作
 */
@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
}

/**
 * 主要是完成耗時的操作
 */
@Override
protected Bitmap doInBackground(String... arg0) {
    InputStream inputStream=NetService.getInputStreamByUrl(arg0[0]);
    if(inputStream!=null){
        return BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
    }
    return  null;
}

/**
 * 主要是更新UI的操作
 */
@Override
protected void onPostExecute(Bitmap result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    if(this.urlPostHandler!=null&&result!=null){
        this.urlPostHandler.PostHandler(result);
    }
}

@Override
public void run() {
    execute(this.address);
}

}

URLPostHandler:回調接口
public interface URLPostHandler {
void PostHandler(Bitmap bitmap);
}

前台請求圖片並顯示到ImageView
public class MainActivity extends AppCompatActivity {

Button buttonDownload;
ImageView imageViewImg;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    buttonDownload = (Button) findViewById(R.id.buttonDownload);
    imageViewImg = (ImageView) findViewById(R.id.imageViewImg);

    buttonDownload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String address = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490783056273&di=6160d101d31dcf5f44b443ad9c5b2648&imgtype=0&src=http%3A%2F%2Fimg.sc115.com%2Fuploads%2Fallimg%2F110626%2F2011062622383898.jpg";

           NetServiceTask netServerTask= new NetServiceTask(address,new URLPostHandler() {
                @Override
                public void PostHandler(Bitmap bitmap) {
                    imageViewImg.setImageBitmap(bitmap);
                }
            });

            Thread thread=new Thread(netServerTask);
            thread.start();


        }
    });
}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM