如何将 Asynctask 用于位图?

Posted

技术标签:

【中文标题】如何将 Asynctask 用于位图?【英文标题】:How to use Asynctask for bitmap? 【发布时间】:2018-06-16 21:22:25 【问题描述】:

我正在将图像从我的 mp3 文件中提取到 Bitmap[],但这会导致应用程序停止一点,我想使用 Asynctask 使其更流畅。

这是我得到位图的方式:

  Bitmap[] bm = new Bitmap[mySongs.size()];       
  for (int i = 0; i < mySongs.size(); i++) 
        if (mySongs.size() > 0) 
        u = Uri.parse(mySongs.get(i).toString());
        mediaMetadataRetriever = new MediaMetadataRetriever();
        mediaMetadataRetriever.setDataSource(getApplicationContext(), u);      
        byte[] artBytes = mediaMetadataRetriever.getEmbeddedPicture();  
        if(artBytes != null) 
            InputStream is = new ByteArrayInputStream(mediaMetadataRetriever.getEmbeddedPicture());
            bm[i] = BitmapFactory.decodeStream(is);         
          
   

怎么放到Asynctask中?

【问题讨论】:

把它放在你的 AsyncTask 的 doInBackground() 中。 【参考方案1】:

这就是你的实现的样子:

  AsyncTask myAsyncTask = new AsyncTask() 
    @Override
    protected Object doInBackground(Object[] objects) 
      //ToDo: Do all the work in here and return result as object
      return null;
    

    @Override
    protected void onPostExecute(Object o) 
      super.onPostExecute(o);
      //ToDo: Do whatever you want to do with the result in here
    
  

我建议创建一个扩展 AsyncTask 的静态类,或者不要在此处传递任何上下文,否则可能会发生内存泄漏

【讨论】:

以上是关于如何将 Asynctask 用于位图?的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask源码解析

如何使用 AsyncTask 更新全局变量

如何将位图保存在从 Internet 下载的内部存储中

在 AsyncTask 中使用 Picasso 从 URL 获取位图

Android开发学习之路-使用AsyncTask进行异步操作

从片段调用 Android AsyncTask 没有调用其成员 - doInbackground、onpreexecute、onpostexecute