2014-01-29 57 views
0

我做了一個媒體播放器,我想加載一個ArrayList中的MP3文件。我在一個名爲get getMP3Files的方法中做了這個。這需要相當長的時間。所以我想把這個我另一個線程。但是我沒有在run()中獲取Context和方法。如何獲得線程中的上下文或縮短進程?

是否有可能縮短這個過程或獲取上下文?

在此先感謝!

getMP3Files:

private void getMP3Files(Context context, String directory,ArrayList<MusicListArray> mp3_list){ 

    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); 
    Uri uri; 
    byte[] album_art; 
    Bitmap bitmap; 
    /*File[] files = Directory.listFiles(new MP3FileNameFilter()); 
    files = Directory.listFiles();*/ 

    File folder = new File(directory); 
    for (File file : folder.listFiles()) { 
     if (file.isFile()) { 
      if (file.getName().endsWith(".mp3") || file.getName().endsWith(".MP3")) { 
       uri = Uri.fromFile(file); 
       mediaMetadataRetriever.setDataSource(context,uri); 
       String artist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); 
       String title = file.getName(); 
       album_art = mediaMetadataRetriever.getEmbeddedPicture(); 
       if(album_art != null){ 
        bitmap = BitmapFactory.decodeByteArray(album_art, 0, album_art.length); 
       }else{ 
        bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher); 
       } 
       if(bitmap == null){ 
        bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher); 
       } 
       if (title.indexOf(".") > 0) 
        title = title.substring(0, title.lastIndexOf(".")); 
       if(artist == null){ 
        artist = getString(R.string.unknown_artist); 
       } 

       mp3_list.add(new MusicListArray(title,artist,file,bitmap)); 
      } 
     }else if(file.isDirectory()){ 
      getMP3Files(context, file.getPath(), mp3_list); 
     } 
    } 
    Collections.sort(mp3_list); 

    /*for(int i=0;i<files.length;i++){ 
     mp3_list.add(new MusicListArray(files[i].getName(),"Test",files[i])); 
    }*/ 
    //return mp3_list; 
} 

我希望它是這樣的:

public void run() { 
      getMP3Files(this, Environment.getExternalStorageDirectory().getPath(), list); 
      StableArrayAdapter adapter = new StableArrayAdapter(this,R.layout.drawer_list_item,list); 
      // Set the adapter for the list view 
      mDrawerList.setAdapter(adapter); //Error 
     } 
+1

你的方法在一個活動或另一個類中運行的位置? – Jorgesys

+0

run()方法在活動中是內部的嗎?在這種情況下,您可以使用MYActivity.this –

+0

'run()'和'getMP3Files'在MainActivity中。 @ phemt.latd不起作用。 :/ 任何想法如何縮短搜索文件,所以我不需要線程? –

回答

0

你不應該嘗試更新非UI線程UI。 UI只應在UI線程中更新。推UI更新調用使用適合你以下方法之一UI線程:

Activity.runOnUiThread(Runnable) 
View.post(Runnable) 
View.postDelayed(Runnable, long) 

在你的情況,你能避免線程的複雜性和使用AsyncTask。這是專門在後臺執行耗時的任務。