2014-01-29 2 views
0

Media Player를 만들고 ArrayList에 mp3 파일을로드하고 싶습니다. get getMP3Files라는 메서드에서이를 만듭니다. 이것은 오랜 시간이 걸립니다. 그래서 나는 그것을 다른 실에 넣고 싶었다. 하지만 나는 컨텍스트와 run() 메소드를 얻지 못한다.스레드에서 컨텍스트를 얻거나 프로세스를 단축하는 방법은 무엇입니까?

프로세스를 단축하거나 컨텍스트를 가져올 가능성이 있습니까?

미리 감사드립니다.

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; 
} 

I는 다음과 같이 원하는 :

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를 사용할 수 있습니다.이 –

+0

'run()'과'getMP3Files'는 MainActivity에 있습니다. @ phemt.latd가 작동하지 않습니다. :/ 파일 검색을 줄이는 방법에 대한 아이디어가 있으니 스레드가 필요하지 않습니까? –

답변

0

당신은 비 UI 스레드에서 UI를 업데이트하려고해서는 안된다. UI는 UI 스레드에서만 업데이트해야합니다. UI가 업데이트가 당신을 위해 적합한 다음 방법 중 하나를 사용하여 UI 스레드에 대한 호출 밀어 :

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

를 귀하의 경우에는, 당신은 스레드의 복잡성을 피하고 AsyncTask를 사용할 수 있습니다. 특히 백그라운드에서 시간이 많이 걸리는 작업을 수행하는 것입니다.

관련 문제