httpclient+asynctask下载图片并保存在本地

xiaoxiao2021-02-27  226

1、httpclient过时,

在Android studio中可以这样设置再使用:

useLibrary 'org.apache.http.legacy'

2、权限:

<!--权限--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3、布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/img_down" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <Button android:id="@+id/btn_down" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/img_down" android:onClick="clickbutton" android:text="下载" /> </RelativeLayout>

4、文件工具类

package com.example.administrator.downloadimage; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * Created by Administrator on 2017/5/4. */ public class FileUtils { private static final String CACHE_DIR = Environment.getExternalStorageDirectory() + "/my_caches/images";// 缓存文件夹 /** * 判断sdcard是否挂载 * * @return */ public static boolean isMounted() { String state = Environment.getExternalStorageState(); return state.equals(Environment.MEDIA_MOUNTED); } /** * 获取sdcard的根目录 * * @return */ public static String getSDCARDDir() { return Environment.getExternalStorageDirectory().getAbsolutePath(); } /** * 存储图片一 * * @param url : 图片的http网络地址 * @param data * @throws IOException */ public static void saveImage(String url, byte[] data) throws IOException { // 1. 判断是否有sdcard if (!isMounted()) { return; } // 2. 判断是否有缓存的文件夹 File dir = new File(CACHE_DIR); if (!dir.exists()) { dir.mkdirs();// 多层文件夹 } // 3. 存储图片到sdcard File file = new File(dir, getFilename(url)); FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.close(); } /** * 保存图片二 * * @param url : 图片的http网络地址 * @param bitmap * @throws IOException */ public static void saveImage(String url, Bitmap bitmap) throws IOException { // 1. 判断是否有sdcard if (!isMounted()) { return; } // 2. 判断是否有缓存的文件夹 File dir = new File(CACHE_DIR); if (!dir.exists()) { dir.mkdirs(); } // 3. 存储图片到sdcard File file = new File(dir, getFilename(url)); FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } /** * 获取图片名 * * @param url * @return */ public static String getFilename(String url) { return url.substring(url.lastIndexOf("/") + 1); } /** * 读图片 * * @param url * @return */ public static Bitmap readImage(String url) { // 判断是否有sdcard if (!isMounted()) { return null; } File file = new File(CACHE_DIR, getFilename(url)); if (file.exists()) { // file->bitmap return BitmapFactory.decodeFile(file.getAbsolutePath()); } return null; } /** * 清空缓存目录 */ public void clearCaches() { File dir = new File(CACHE_DIR); File[] allfiles = dir.listFiles(); for (File file : allfiles) { file.delete(); } } }

5、加载数据并保存

利用httpclient请求,asynctask异步,加载图片并保存在本地。

package com.example.administrator.downloadimage; import android.app.ProgressDialog; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.io.IOException; public class MainActivity extends AppCompatActivity { private ImageView img_down; private String url = "http://b.hiphotos.baidu.com/image/pic/item/d1160924ab18972bf5f68cc8e0cd7b899f510ae7.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img_down = (ImageView) this.findViewById(R.id.img_down); } public void clickbutton(View view) { Bitmap bitmap = FileUtils.readImage(url); if (bitmap != null) { img_down.setImageBitmap(bitmap); } else { // 发送异步请求 new MyAsyncTask(this).execute(url); } } class MyAsyncTask extends AsyncTask<String, Void, byte[]> { private ProgressDialog pDialog; public MyAsyncTask(Context context) { pDialog = new ProgressDialog(context); pDialog.setIcon(R.mipmap.ic_launcher); pDialog.setTitle("提示"); pDialog.setMessage("The data is loading..."); } @Override protected void onPreExecute() { super.onPreExecute(); pDialog.show(); } @Override protected byte[] doInBackground(String... params) { try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { byte[] datas = EntityUtils.toByteArray(response.getEntity()); // 缓存工具类:保存图片 FileUtils.saveImage(params[0], datas);// url:params[0] return datas; } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(byte[] result) { super.onPostExecute(result); if (result != null) { Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length); img_down.setImageBitmap(bitmap); } pDialog.dismiss(); } } }

注意:

//保存图片后发送广播通知更新数据库 Uri uri = Uri.fromFile(file); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
转载请注明原文地址: https://www.6miu.com/read-9061.html

最新回复(0)