我正在为我的android项目使用外部库。使用该库,我从流Mp3 url获取ID3标签。该代码使用URLConnection到达链接,然后获取标签信息。但是问题是过程非常缓慢。

在主线程上执行此操作时,需要花费2分钟以上的时间才能从其网址中获得25首歌曲的ID3标签。因此,我决定使用多个AsyncTasks来加快此过程的速度,我在下面使用了此代码。它变快了一点,但仍比2分钟标记少了几秒钟。当我从DDMS中检查“线程”选项卡时,发现在运行时只有6个AsyncTask被创建并正在运行。

我的问题是,如何在此循环中增加正在运行的AsyncTask的数量。

counter=0;
for (final SongDetail e : songs) {

  new AsyncTask<Void , Void, Void>() {


  @Override
  protected Void doInBackground(Void... params) {

    try {

       MP3 mp3 = new MP3(e.getLink());
       e.setTitle(mp3.getTitle());
       e.setArtist(mp3.getBand());
    } catch (MalformedURLException e1) {
          e1.printStackTrace();
    } catch (IOException e2) {
          e2.printStackTrace();
    }
    return null;
    }

  @Override
  protected void onPostExecute(Void result) {
   counter++;

   if(counter==songs.size()) {
      Log.d("KA","loop finished");

     }
  }

 }.execute();
}

最佳答案

Android操作系统将决定在任何给定时间可以运行多少个并行线程。仅仅因为您启动了20个并不意味着它们都会全部运行。 Android OS会将它们排队,并一次运行其中的一些。

查看此答案以获取更多详细信息:
Running multiple AsyncTasks at the same time -- not possible?

10-04 10:25