2017-12-01 13 views
0

異なる間隔でメディアを再生しようとしています。 メディアを再生する関数playAudio()があり、メディアファイルが再生されるときにasynctaskが実行され、次のメディアの時間の計算が開始されます。asynctask(android)を使用してメディアを再生する

間隔は、my asynctaskのdoInBackground()メソッドで計算されます。インターバルが上がると、onPostExecute関数はそのplayAudio()関数を呼び出します。 最初のメディアファイルを再生した後、アプリがクラッシュします。 ヘルプしてください!

public void startNextFile() { 

    if (mCompleted < nums.size()) { 
     int a=Integer.parseInt(nums.get(c++)); 



     currentTime=System.currentTimeMillis(); 
     mp[mCompleted] = MediaPlayer.create(this, songIds[a]); 


     mp[mCompleted].start(); 
     ArrayList<String> payload=new ArrayList<String>(0); 

     payload.add(++mCompleted+""); 
     payload.add(differences.get(mCompleted-1)); 
     payload.add(currentTime+""); 

     AsyncTask thread=new AsyncTask<ArrayList<String>,Void,Boolean>(){ 

      @Override 
      protected Boolean doInBackground(ArrayList<String>[] strings) { 
       //int idx= Integer.parseInt(strings[0].toString()); 
       long diff=Long.parseLong(strings[1].toString()); 
       long current_time=Long.parseLong(strings[2].toString()); 
       boolean isTime=false; 
       while(!isTime) 
       { 
        if(System.currentTimeMillis()-current_time==diff) 
        { 
         isTime=true; 
        } 
       } 
       return isTime; 
      } 

      @Override 
      protected void onPostExecute(Boolean aBoolean) { 
       super.onPostExecute(aBoolean); 
       startNextFile(); 

      } 
     }; 

     thread.execute(payload); 



    } 
    else 
    { 
     mCompleted=0; 
    } 
} 

編集:java.lang.ClassCastExceptionが: 「によって引き起こさ: だから、logcatを確認した後、このエラーがあるようですjava.lang.Objectの[]はjava.util.ArrayListにキャストすることはできません[] com.example.cracked.pianist.Player $ 2.doInBackground(Player.java:208)で 」

208は、非同期タスクが

更新されたコードだけdoInBackground機能をチェックする

を開始する行です
public void startNextFile() { 

    if (mCompleted < nums.size()) { 
     int a=Integer.parseInt(nums.get(c++)); 



     currentTime=System.currentTimeMillis(); 
     mp[mCompleted] = MediaPlayer.create(this, songIds[a]); 


     mp[mCompleted].start(); 
     ArrayList<String> payload=new ArrayList<>(0); 
     //Toast.makeText(Player.this,"starting thread",Toast.LENGTH_SHORT).show(); 
     payload.add(++mCompleted+""); 
     payload.add(differences.get(mCompleted-1)+""); 
     payload.add(currentTime+""); 

     AsyncTask thread=new AsyncTask<ArrayList<String>,Void,Integer>(){ 

      @Override 
      protected Integer doInBackground(ArrayList<String>[] arrayLists) { 
       //int idx= Integer.parseInt(arrayLists[0].get(0)); 
       //long diff=Long.parseLong(arrayLists[0].get(1)); 
       //long current_time=Long.parseLong(arrayLists[0].get(2)); 
       //long current_time=System.currentTimeMillis(); 

       int count=Integer.parseInt(arrayLists[0].get(0)); 
       //boolean isTime=false; 
       //Log.d("starting","loop starting"); 
       /*while(!isTime) 
       { 
        if(System.currentTimeMillis()-current_time==diff) 
        { 
         isTime=true; 
        } 
       }*/ 
       return count; 
      } 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

      } 


      @Override 
      protected void onPostExecute(Integer integer) { 
       super.onPostExecute(integer); 
       Log.d("error","size is: "+integer); 
       Toast.makeText(Player.this,"Thread done "+integer,Toast.LENGTH_SHORT).show(); 

      } 
     }; 

     thread.execute(payload); 



    } 
    else 
    { 
     mCompleted=0; 
    } 
} 
+0

コードスニペットを共有してください。 – dpaksoni

答えて

0

parseLong()メソッドにString値の代わりにArrayListを渡しています。だからあなたのクラスを取得する例外がキャストします。

long diff=Long.parseLong(strings[0].get(0)); 
long current_time=Long.parseLong(strings[0].get(1)); 

変更この

long diff=Long.parseLong(strings[1].toString()); 
long current_time=Long.parseLong(strings[2].toString()); 

、あなたが他の助けを必要とするならば、私に知らせてください。

+0

私は間違ったインデックスにアクセスして間違いを犯しています。しかし、この誤りを訂正した後、同じエラーが続く。java.lang.Object []はjava.util.ArrayList []にキャストできない。com.example.cracked.pianist.Playerで $ 2.doInBackground(Player.java:208) – noobkid

+0

単に文字列の長さを返すか、string [0] .sizeを返すだけでonPostExecuteメソッドでToastを表示し、doInBackgroundから他のすべてのコードを削除しても。同じエラーでアプリがクラッシュします。 – noobkid

+0

doInBackgroundからすべてのコードを削除して、文字列[0] .get(0)の値だけをlog catに入れてください。正しい場合は、解決した問題が解決する可能性があります。 –

関連する問題