2016-07-03 7 views
0

私は携帯電話のストレージから曲のリストをスキャンし、ListViewに格納するアプリを作っています。だから、私はクラスSongsManagerを作成し、SDカードから曲をスキャンし、Arrayに保存します。コードは以下の通りです。スレッドの - アプリケーションのパフォーマンスを向上させる方法

public class SongsManager { 
final String MEDIA_PATH = Environment.getExternalStorageDirectory() .getPath() + "/"; 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 
private String mp3Pattern = ".mp3"; 
private File directory; 

// Constructor 
public SongsManager() { 
} 

/** * Function to read all mp3 files and store the details in * ArrayList * */ 

public ArrayList<HashMap<String, String>> getPlayList() { 
      System.out.println(MEDIA_PATH); 
      if (MEDIA_PATH != null) { 
       File home = new File(MEDIA_PATH); 
       File[] listFiles = home.listFiles(); 
       if (listFiles != null && listFiles.length > 0) { 
        for (File file : listFiles) { 
         System.out.println(file.getAbsolutePath()); 
         if (file.isDirectory()) { 
          scanDirectory(file); 
         } else { 
          addSongToList(file); 
         } 
        } 
       } 
      } 
    return songsList; 
} 


private void scanDirectory(final File directory) { 
      if (directory != null) { 
       File[] listFiles = directory.listFiles(); 
       if (listFiles != null && listFiles.length > 0) { 
        for (File file : listFiles) { 
         if (file.isDirectory()) { 
          scanDirectory(file); 
         } else { 
          addSongToList(file); 
         } 
        } 
       } 
      } 
    } 


private void addSongToList(File song) { 
    if (song.getName().endsWith(mp3Pattern)) { 
     HashMap<String, String> songMap = new HashMap<String, String>(); 
     songMap.put("songTitle", song.getName().substring(0, (song.getName().length() - 4))); 
     songMap.put("songPath", song.getPath()); 

     // Adding each song to SongList 
     songsList.add(songMap); 
    } 
} 
} 

私はアプリを実行すると、アプリはSDカードから曲を取得するため、2〜3秒間フリーズします。 logcatを開くと、エラーThe application may be doing too much work on its main threadが表示されます。だから、私はアプリケーションのパフォーマンスを向上させることにしました。私は次のようにクラスを修正しました

public class SongsManager { 

final String MEDIA_PATH = Environment.getExternalStorageDirectory() .getPath() + "/"; 
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 
private String mp3Pattern = ".mp3"; 
private File directory; 

// Constructor 
public SongsManager() { 
} 

/** * Function to read all mp3 files and store the details in * ArrayList * */ 

public ArrayList<HashMap<String, String>> getPlayList() { 
      System.out.println(MEDIA_PATH); 
      if (MEDIA_PATH != null) { 
       File home = new File(MEDIA_PATH); 
       File[] listFiles = home.listFiles(); 
       if (listFiles != null && listFiles.length > 0) { 
        for (File file : listFiles) { 
         System.out.println(file.getAbsolutePath()); 
         if (file.isDirectory()) { 
          scanDirectory(file); 
         } else { 
          addSongToList(file); 
         } 
        } 
       } 
      } 
    return songsList; 
} 


private void scanDirectory(final File directory) { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      if (directory != null) { 
       File[] listFiles = directory.listFiles(); 
       if (listFiles != null && listFiles.length > 0) { 
        for (File file : listFiles) { 
         if (file.isDirectory()) { 
          scanDirectory(file); 
         } else { 
          addSongToList(file); 
         } 
        } 
       } 
      } 
     } 
    }; 
    Thread thread = new Thread(r); 
    thread.start(); 
} 


private void addSongToList(File song) { 
    if (song.getName().endsWith(mp3Pattern)) { 
     HashMap<String, String> songMap = new HashMap<String, String>(); 
     songMap.put("songTitle", song.getName().substring(0, (song.getName().length() - 4))); 
     songMap.put("songPath", song.getPath()); 

     // Adding each song to SongList 
     songsList.add(songMap); 
    } 
} 
} 

コードを修正した後、問題は解決しましたが、凍結問題は解決しましたが、歌の取り出しは正しく動作しません。アプリを開くと、一部の曲が読み込まれ、一部の曲は読み込まれません。アプリを再び開くと、さらにいくつかの曲が読み込まれます。この問題が発生しています。 は、ここに私のTab1 Classコード

public class Tab1 extends ListFragment { 

private ListView lv; 
// Songs list 
public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 


public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View V = inflater.inflate(R.layout.tab1, container, false); 

    ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>(); 
    SongsManager plm = new SongsManager(); 
    // get all songs from sdcard 
    this.songsList = plm.getPlayList(); 

    // looping through playlist 
    for (int i = 0; i < songsList.size(); i++) { 
     // creating new HashMap 
     HashMap<String, String> song = songsList.get(i); 
     // adding HashList to ArrayList 
     songsListData.add(song); 
    } 

    // Adding menuItems to ListView 
    ListAdapter adapter = new SimpleAdapter(getContext(), songsListData, 
      R.layout.playlist_item, new String[]{"songTitle"}, new int[]{ 
      R.id.songTitle}); 
    setListAdapter(adapter); 
    return V; 
} 

}

+0

「getPlayList()」をどこで呼び出せばよいですか? –

+0

追加...してください。 –

答えて

0

が使用することを検討しているAsyncTask代わりに、上記の実装...あなたの実装では、あなたのplm.getPlaylist()はそれとして完成された後、すべての曲がスキャンされていることを保証する方法がないのいくつかの異なるスレッドで実行されます。だからあなたはすべての曲を見ていないのです。あなたのリストのフラグメントはSongsReceivedListenerを実装し、あなたのListFragmentがTab1をがListFragmentがGetSongsAsyncTask.SongsReceivedListener {

を実装して拡張し、この

パブリッククラスのようになります。

new GetSongsAsyncTask(this).execute(); 

このように、このAsyncTaskを呼び出します

public class GetSongsAsyncTask extends AsyncTask<Void, Void, List<Hashmap<String, String>>> { 
private final SongsManager mSongsManager; 

public interface SongsReceivedListener { 
    void onSongsReceived(List<HashMap<String, String>> songs); 
} 

private SongsReceivedListener mSongsReceivedListener; 

public GetSongsAsyncTask(SongsReceivedListener mSongsReceivedListener) { 
    this.mSongsReceivedListener = mSongsReceivedListener; 
    mSongsManager = new SongsManager(); 
} 

@Override 
protected List<HashMap<String, String>> doInBackground(Void.. voids) { 
    return mSongsManager.getPLayList(); 
} 

@Override 
protected void onPostExecute(List<HashMap<String, String>> v) { 
    if(mSongsReceivedListener != null) { 
     mSongsReceivedListener.onSongsReceived(v); 
    } 
} 
} 

プライベートListView lv; //ソングリスト public ArrayList> songsList = new ArrayList>(); public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); }

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View V = inflater.inflate(R.layout.tab1, container, false); 
    new GetSongsAsyncTask(this).execute(); 
    return V; 
} 

@Override 
void onSongsReceived(List<Hashmap<String, String>> songs) { 
    if(getContext() == null) 
    return; 
    // looping through playlist 
    for (int i = 0; i < songsList.size(); i++) { 
     // creating new HashMap 
     HashMap<String, String> song = songs.get(i); 
     // adding HashList to ArrayList 
     songsListData.add(song); 
    } 

    // Adding menuItems to ListView 
    ListAdapter adapter = new SimpleAdapter(getContext(), songsListData, 
      R.layout.playlist_item, new String[]{"songTitle"}, new int[]{ 
      R.id.songTitle}); 
    setListAdapter(adapter); 
} 

} 
+0

@AkshaySharma thats私がやったこと。私は詳細を追加しようとしましょう –

+0

@AkshaySharmaはもっと多くの実装を追加しました –

+0

ありがとうございます。 。しばらくお待ちください...私はあなたにお返ししようとします。もう一度ありがとう –

関連する問題