2017-08-19 2 views
0

SongsManagerLaden von MP3-Dateien von mobilen viel Zeit in Anspruch nimmt mit sogar Async Aufgabe

public class SongsManager { 


    public ArrayList<HashMap<String, String>> getPlayList(String rootPath) { 
     ArrayList<HashMap<String, String>> fileList = new ArrayList<>(); 

     try { 
      File rootFolder = new File(rootPath); 
      File[] files = rootFolder.listFiles(); //here you will get NPE if directory doesn't contains any file,handle it like this. 
      for (File file : files) { 
       if (file.isDirectory()) { 
        if (getPlayList(file.getAbsolutePath()) != null) { 
         fileList.addAll(getPlayList(file.getAbsolutePath())); 
        } else { 
         break; 
        } 
       } else if (file.getName().endsWith(".mp3")) { 
        HashMap<String, String> song = new HashMap<>(); 
        song.put("file_path", file.getAbsolutePath()); 
        song.put("file_name", file.getName()); 
        fileList.add(song); 
       } 
      } 
      return fileList; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

PlaylistActivity

public class PlaylistActivity extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private SongsAdapter songsAdapter; 
    private SongsManager songsManager; 
    String MEDIA_PATH = Environment.getExternalStorageDirectory() + ""; 
    ArrayList<HashMap<String, String>> songList=new ArrayList<>();; 
    MyTask myTask; 
    List<MyTask> myTasks; 
    ProgressBar progressBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_playlist); 
     myTasks=new ArrayList<>(); 
     recyclerView=(RecyclerView)findViewById(R.id.playlistactivityrecyclerview); 
     progressBar=(ProgressBar)findViewById(R.id.progressbar); 
     myTask=new MyTask(); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 0); 
      } else { 
       myTask.execute(); 
      } 

     } 

    } 

    public void updateRecycler(){ 

     songsAdapter=new SongsAdapter(songList,getApplicationContext()); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
     recyclerView.setAdapter(songsAdapter); 
    } 

    public class MyTask extends AsyncTask<Void,String, ArrayList<HashMap<String, String>>>{ 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      if(myTasks.size()==0){ 
       progressBar.setVisibility(View.VISIBLE); 
      } 
      myTasks.add(this); 
     } 

     @Override 
     protected ArrayList<HashMap<String, String>> doInBackground(Void... params) { 
      songsManager=new SongsManager(); 
      songList =songsManager.getPlayList(MEDIA_PATH); 
      return songList; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<HashMap<String, String>> hashMaps) { 
      super.onPostExecute(hashMaps); 
      myTasks.remove(this); 
      if(myTasks.size()==0){ 
       progressBar.setVisibility(View.INVISIBLE); 
      } 

      if(hashMaps==null){ 
       Toast.makeText(getApplicationContext(),"No mp3 Files",Toast.LENGTH_LONG).show(); 
       return; 
      } 
      updateRecycler(); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if(requestCode==0){ 
      if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
       myTask.execute(); 
      } 
     } 
    } 
} 

ich alle Dateien in recyclerview meine mp3 mit einem Textview in it.The Laden bin Laden von MP3-Dateien brauchen viel Zeit. Selbst wenn ich AsyncTask verwende, dauert es sehr viel Zeit. Bitte hilf mir bei dem, was mache ich falsch? Ich habe versucht, es ohne Asyntask zu machen, dann braucht es auch viel Zeit. Gibt es einen effizienteren Weg, MP3-Dateien abzurufen?

+0

"Bitte helfen Sie mir mit was mache ich falsch?" - Sie fragen nicht den 'MediaStore' nach allen indizierten MP3-Inhalten ab. – CommonsWare

Antwort

0

Die Verwendung von AsyncTask reduziert nicht unbedingt die Zeit, die für einen bestimmten Vorgang benötigt wird. In einem Hintergrundthread wird nur die gleiche Arbeit ausgeführt, sodass der UI-Thread nicht blockiert wird und die Benutzeroberfläche für die Benutzerinteraktionen reaktionsfähig ist.

Es wird also keinen Unterschied in der Zeit geben, wenn Sie AsyncTask verwenden oder nicht. Das einzige, was Sie sehen müssen, ist, ob die Benutzeroberfläche nicht blockiert wird und auf Benutzerinteraktionen reagiert.

+0

Wissen Sie also, wie Sie MP3-Dateien schnell abrufen können? – Pritish

Verwandte Themen