从网络获取图片,并缓存到SD卡

举报
再见孙悟空_ 发表于 2022/01/12 22:58:50 2022/01/12
【摘要】 效果图: 图片存在bmob(http://www.bmob.com )后台,所以下载Demo运行的话要到官网申请 Application ID。 先点击上传图片,再点击缓存图片,不然没数据。 代码: paths=new String[5]; for(int...







图片存在bmob( )后台,所以下载Demo运行的话要到官网申请 Application ID。
先点击上传图片,再点击缓存图片,不然没数据。


代码:
  1. paths=new String[5];
  2. for(int i=0;i<5;i++){
  3.         //图片路径
  4.         paths[i]=Environment.getExternalStorageDirectory()+"/"+i+".jpg";        
  5.   }
复制代码
上面的代码要改为自己的图片路径。

主要代码:

IndexActivity


  
  1. public class IndexActivity extends Activity {
  2. private String[] paths;
  3. private int j;
  4. private File cache;
  5. private String appid=""; //你的Application ID
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. Bmob.initialize(this, appid);
  9. setContentView(R.layout.activity_index);
  10. ///创建缓存目录
  11. cache=new File(Environment.getExternalStorageDirectory(),"cache");
  12. if(!cache.exists()){
  13. cache.mkdirs();
  14. }
  15. }
  16. public void skip(View v){
  17. Intent intent=new Intent(this,MainActivity.class);
  18. startActivity(intent);
  19. }
  20. public void upload(View v){
  21. paths=new String[5];
  22. for(int i=0;i<5;i++){
  23. //图片路径
  24. paths[i]=Environment.getExternalStorageDirectory()+"/"+i+".jpg";
  25. }
  26. //批量上传图片
  27. Bmob.uploadBatch(this, paths, new UploadBatchListener() {
  28. @Override
  29. public void onSuccess(List<BmobFile> arg0, List<String> arg1) {
  30. // TODO Auto-generated method stub
  31. String strurl="";
  32. for(String url:arg1){
  33. strurl=url;
  34. }
  35. Person p=new Person();
  36. p.setIcPath(strurl);
  37. p.setStr("s"+j);
  38. p.save(IndexActivity.this);
  39. j++;
  40. toast("第"+j+"个上传成功!");
  41. }
  42. @Override
  43. public void onProgress(int curIndex, int curPercent, int total, int totalPercent) {
  44. // TODO Auto-generated method stub
  45. //1、curIndex--表示当前第几个文件正在上传
  46. //2、curPercent--表示当前上传文件的进度值(百分比)
  47. //3、total--表示总的上传文件数
  48. //4、totalPercent--表示总的上传进度(百分比)
  49. MyUtil.logI(curIndex+" "+curPercent+" "+total+" "+totalPercent);
  50. }
  51. @Override
  52. public void onError(int arg0, String arg1) {
  53. // TODO Auto-generated method stub
  54. toast("error "+arg1);
  55. MyUtil.logI("errer "+arg1);
  56. }
  57. });
  58. }
  59. // 清理缓存
  60. public void clear(View v){
  61. if(cache.length()!=0){
  62. File[] files=cache.listFiles();
  63. for(File file:files){
  64. file.delete();
  65. }
  66. cache.delete();
  67. toast("缓存清理成功");
  68. }else{
  69. toast("暂无缓存");
  70. }
  71. }
  72. public void toast(String msg){
  73. Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
  74. }
  75. }



  1. 
          
    1. public class MainActivity extends Activity {
    2. private ListView lv;
    3. private MyAdapter adapter;
    4. private File cache;
    5. private List<Person> list;
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_main);
    9. initView();
    10. }
    11. private void initView() {
    12. // TODO Auto-generated method stub
    13. lv=(ListView)findViewById(R.id.listView1);
    14. list=new ArrayList<Person>();
    15. cache=new File(Environment.getExternalStorageDirectory(),"cache");
    16. if(!cache.exists()){
    17. cache.mkdirs();
    18. }
    19. getData();
    20. }
    21. private void getData() {
    22. // TODO Auto-generated method stub
    23. //查询数据
    24. BmobQuery<Person> bq=new BmobQuery<Person>();
    25. bq.setCachePolicy(CachePolicy.CACHE_ELSE_NETWORK); //缓存查询
    26. bq.findObjects(this, new FindListener<Person>() {
    27. @Override
    28. public void onSuccess(List<Person> arg0) {
    29. // TODO Auto-generated method stub
    30. list=arg0;
    31. adapter=new MyAdapter(MainActivity.this, list, cache);
    32. lv.setAdapter(adapter);
    33. }
    34. @Override
    35. public void onError(int arg0, String arg1) {
    36. // TODO Auto-generated method stub
    37. MyUtil.logI("errer "+arg1);
    38. }
    39. });
    40. }





  1. 
          
    1. public class MyAdapter extends BaseAdapter {
    2. private Context context;
    3. private List<Person> list;
    4. private File cache;
    5. public MyAdapter(Context context, List<Person> list, File cache) {
    6. this.context = context;
    7. this.list = list;
    8. this.cache = cache;
    9. }
    10. @Override
    11. public int getCount() {
    12. // TODO Auto-generated method stub
    13. return list.size();
    14. }
    15. @Override
    16. public Object getItem(int position) {
    17. // TODO Auto-generated method stub
    18. return list.get(position);
    19. }
    20. @Override
    21. public long getItemId(int position) {
    22. // TODO Auto-generated method stub
    23. return position;
    24. }
    25. @Override
    26. public View getView(int position, View convertView, ViewGroup parent) {
    27. // TODO Auto-generated method stub
    28. ViewHolder vh;
    29. if(convertView==null){
    30. convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
    31. vh=new ViewHolder();
    32. vh.tv=(TextView)convertView.findViewById(R.id.tv);
    33. vh.iv=(ImageView)convertView.findViewById(R.id.iv);
    34. convertView.setTag(vh);
    35. }else{
    36. vh=(ViewHolder)convertView.getTag();
    37. }
    38. final Person p=list.get(position);
    39. vh.tv.setText(p.getStr());
    40. // 异步的加载图片
    41. MyUtil mu=new MyUtil();
    42. AsyncImageTask as=new AsyncImageTask(mu,vh.iv,cache);
    43. if(p.getIcPath()!=null){
    44. as.execute(p.getIcPath());
    45. }else{
    46. vh.iv.setImageResource(R.drawable.ic_launcher);
    47. }
    48. return convertView;
    49. }
    50. class ViewHolder{
    51. TextView tv;
    52. ImageView iv;
    53. }
    54. }



  1. 
          
    1. public class MyUtil {
    2. /**
    3. * 从网络上获取图片,如果图片在本地存在的话就直接拿,如果不存在再去服务器上下载图片
    4. * */
    5. public Uri getImageURI(String path,File cache) throws Exception{
    6. String name=MD5.getMD5(path)+path.substring(path.lastIndexOf("."));
    7. logI("name"+name);
    8. File file=new File(cache, name);
    9. // 如果图片存在本地缓存目录,则不去服务器下载
    10. if(file.exists()){
    11. logI("cache");
    12. return Uri.fromFile(file);
    13. }else{
    14. URL url=new URL(path);
    15. HttpURLConnection conn=(HttpURLConnection)url.openConnection();
    16. conn.setConnectTimeout(5000);
    17. conn.setRequestMethod("GET");
    18. conn.setDoInput(true);
    19. if(conn.getResponseCode()==200){
    20. InputStream is=conn.getInputStream();
    21. FileOutputStream fos=new FileOutputStream(file);
    22. byte[] b=new byte[2*1024];
    23. int len=0;
    24. while((len=is.read(b))!=-1){
    25. fos.write(b,0,len);
    26. }
    27. is.close();
    28. fos.close();
    29. return Uri.fromFile(file);
    30. }
    31. }
    32. return null;
    33. }
    34. public static void logI(String msg){
    35. Log.i("-------", msg);
    36. }
    37. }





AsyncImageTask 


  
  1. public class AsyncImageTask extends AsyncTask<String, Integer, Uri> {
  2. private ImageView ivIcon;
  3. private MyUtil mu;
  4. private File cache;
  5. public AsyncImageTask(MyUtil mu,ImageView ivIcon,File cache) {
  6. this.mu=mu;
  7. this.ivIcon = ivIcon;
  8. this.cache=cache;
  9. }
  10. @Override
  11. protected Uri doInBackground(String... arg0) {
  12. // TODO Auto-generated method stub
  13. try {
  14. return mu.getImageURI(arg0[0], cache);
  15. } catch (Exception e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. return null;
  20. }
  21. @Override
  22. protected void onPostExecute(Uri result) {
  23. // TODO Auto-generated method stub
  24. super.onPostExecute(result);
  25. if(ivIcon!=null && result!=null){
  26. ivIcon.setImageURI(result);
  27. }
  28. }
  29. }


文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/44936345

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。