MainActivity代碼:
package com.demo.save;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.imageview)
ImageView imageview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
if (Task.getDiskBitmap(Task.imagePath) == null) {
loadImg(Task.path);
} else {
imageview.setImageBitmap(Task.getDiskBitmap(Task.imagePath));
}
}
private void loadImg(String url) {
Task task = new Task(new Task.ImageCallBack() {
@Override
public void callBitmap(Bitmap bitmap) {
if (bitmap != null) {
imageview.setImageBitmap(bitmap);
}
}
});
//執行圖檔請求
task.execute(url);
}
}
Task 網絡擷取資料類:
package com.demo.save;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Created by yafr1hz1 on 2017/9/7.
*/
public class Task extends AsyncTask<String, Void, Bitmap> {
public static String path = "http://139.224.104.4:8085/iknow/upload/product/1/2017/8/18/1014148680.jpg";
private String fileName;
public static String imagePath;
/**
* 定義一個圖檔的接口回調
*/
public interface ImageCallBack {
void callBitmap(Bitmap bitmap);
}
//定義變量記住調用者所傳遞進來的回調監聽對象
private ImageCallBack imageCallBack;
//構造方法
public Task(ImageCallBack imageCallBack) {
this.imageCallBack = imageCallBack;
}
@Override
protected Bitmap doInBackground(String... params) {
try {
String path = params[0];
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5 * 1000);
connection.setReadTimeout(2 * 1000);
//伺服器響應
int code = connection.getResponseCode();
if (code == HttpURLConnection.HTTP_OK) {
//判斷伺服器是否連接配接成功并相應 //
InputStream is = connection.getInputStream();
loadImageFromNetwork(MyApplication.getContext(), path);
//将圖檔流轉化成Bitmap位圖,傳回
return BitmapFactory.decodeStream(is);
}
} catch (Exception e) {
Log.d("網絡錯誤----", e.toString());
}
return null;
}
public void loadImageFromNetwork(Context context, String imageUrl) {
// 擷取url中圖檔的檔案名與字尾
if (imageUrl != null && imageUrl.length() != 0) {
fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
}
// 圖檔在手機本地的存放路徑, 注意:fileName為空的情況
imagePath = context.getCacheDir() + "/" + fileName;
File file = new File(context.getCacheDir(), fileName);
// 儲存檔案
if (!file.exists() && !file.isDirectory()) {
try {
// 可以在這裡通過檔案名來判斷,是否本地有此圖檔
FileOutputStream fos = new FileOutputStream(file);
InputStream is = new URL(imageUrl).openStream();
int data = is.read();
while (data != -1) {
fos.write(data);
data = is.read();
}
fos.close();
is.close();
} catch (IOException e) {
Log.d("test", e.getMessage());
}
} else {
Log.d("test", "file.exists()檔案存在,本地擷取");
}
Log.d("檔案路徑-----", imagePath);
}
//讀取本地圖檔 參數: 檔案路徑
public static Bitmap getDiskBitmap(String pathString) {
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeFile(pathString);
} catch (Exception e) {
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if (fileName == null) {
Toast.makeText(MyApplication.getContext(),"請檢查網絡狀态後重試",Toast.LENGTH_LONG).show();
}
if (bitmap != null) {
//設定圖檔 回調回去
imageCallBack.callBitmap(bitmap);
}
}
}
Application :
package com.demo.save;
import android.app.Application;
import android.content.Context;
/**
* Created by yafr1hz1 on 2017/9/7.
*/
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
/**
* 擷取全局上下文
*/
public static Context getContext() {
return context;
}
}
注:在manifest檔案中<application>節點下配置 android:name="MyApplication"
添加網絡通路權限
布局檔案: (喜歡的話可以自己添加一個button,點選button後加載圖檔,這裡是在Activity建立之後直接加載圖檔的)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.demo.save.MainActivity"
>
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
好了,到這裡結束了.第一篇部落格!