2017-01-25 66 views
0

我必須在異步任務的本地文件夾中運行所有圖像和視頻視圖。我從文件夾中檢索了所有文件。基於文件類型i啓用ImageViewVideoView的可見性。如何在異步任務中運行圖像和視頻

我被困在這一點,我必須不斷循環這一點,並保持播放所有的圖像和視頻,直到應用程序關閉。一點指導都很有幫助。

我現有的代碼

private void SetDirectory() 
{ 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      m_FolderPath = Environment.getExternalStorageDirectory().toString(); 

      File txtDirectory = new File(m_FolderPath + "/TestPlayer/"); 
      // Create a File object for the parent directory 
      boolean IsSuccess = false; 
      if(!txtDirectory.exists()) 
      { 
       IsSuccess = txtDirectory.mkdir(); 
      } 
      if(IsSuccess == true) 
      { 
       Log.d("Folder Created" , "Success"); 
      } 
      else 
      { 
       Log.d("Folder not Created" , "Not Created"); 
      } 

      List<File> files = loadImageFromStorage(txtDirectory.toString()); 

      if(files.size() > 0) 
      { 
       for(int nCount = 0; nCount < files.size() ; nCount ++) 
       { 
        String FileName = files.get(nCount).toString(); 
        m_CurrentMediaFilePath = FileName; 
        String FileExtension = FileName.substring(FileName.lastIndexOf(".")); 

        if(FileExtension.equalsIgnoreCase(".jpg") || FileExtension.equalsIgnoreCase(".png")) 
        { 
         m_VideoView.setVisibility(View.INVISIBLE); 
         m_ImageView.setVisibility(View.VISIBLE); 
         File imgFile = new File(FileName); 
         Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
         m_ImageView.setImageBitmap(myBitmap); 
         m_ImageView.bringToFront(); 
         try 
         { 
          Thread.sleep(5000); 
         } 
         catch (Exception ex) 
         {} 
        } 
        else if(FileExtension.equalsIgnoreCase(".mp4")) 
        { 
         try 
         { 
          m_VideoView.setVisibility(View.VISIBLE); 
          m_VideoView.bringToFront(); 
          //m_ImageView.setVisibility(View.INVISIBLE); 
          m_VideoView.setVideoPath(FileName); 
          m_VideoView.start(); 
         } 
         catch (Exception ex) 
         { 
          Log.d("N", ex.toString()); 
         } 
        } 
       } 
      } 

     } 
    }); 
} 


public class MediaPlayer extends AsyncTask<String,Void, String> 
{ 
    @Override 
    protected void onProgressUpdate(Void... values) 
    { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     SetDirectory(); 
     return "Completed"; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    } 
} 
+0

'的Thread.sleep(5000); '在uiThread上將會凍結這個應用程序,然後它會設置下一個圖像,但它仍然會凍結,在加載完最後一張圖片後,凍結將結束並且UI將被更新,因此您只會選擇最後一張圖像。 你必須用Handler(在uithread上創建)和postDelayed來完成它,它將發佈Runnables,它將顯示下一張圖像,併發布延遲的下一個Runnables以顯示下一張圖像,直到它成爲最後一張圖像。 – RadekJ

+0

抱歉的延遲..是否有可能我不斷運行這個過程,因爲它結束了。一旦所有的文件都完成了,我可以重新開始這個過程..我對c#很滿意,而在c#中有windows媒體播放器。我們可以創建一個包含所有圖片和視頻的播放列表。並重新玩一遍。我不知道如何在Android中做到這一點..有沒有辦法呢..? – user3501749

+0

我會從'Timer'開始,它允許您安排一些操作,讓每5秒說一次,並在需要時取消它。然後在這個動作中,我會寫一個方法'showCurrentMedia',它將得到currentIndex並顯示與這個索引相關的媒體並且增加這個currentIndex(當然如果這個索引等於你的列表大小,你必須將它重置爲零值從開始) https://developer.android.com/reference/java/util/Timer.html – RadekJ

回答

0

另一種方式來做到這一點是類似的東西:

void showFilesOnUiThread(final List<File> files) { 
     new Thread(new Runnable { 

      public void run() { 
       for(File file : files) { 
        runOnUiThread(new Runnable() { 
         public void run() { 
          showFile(file); 
         } 
        }); 
        Thread.sleep(5000); 
       } 
      } 
    }).start(); 
} 
課程實施的 showFile

是你

+0

感謝您的幫助,併爲延誤表示歉意。你能提供一點關於代碼的指導嗎? 2.請參考我的問題下的評論,以便更清楚地瞭解我在android中遇到的問題。 – user3501749