简体   繁体   English

使用asynctask播放媒体(android)

[英]Playing media using asynctask(android)

I am trying to play media at different intervals. 我试图以不同的时间间隔播放媒体。 I have a function that plays the media void playAudio() and when ever a media file is played a asynctask is executed to start calculating the time for the next media. 我有一个播放媒体无效的函数playAudio(),无论何时播放媒体文件,都会执行asynctask以开始计算下一个媒体的时间。

The intervals are calculated in the doInBackground() method of my asynctask. 间隔是在asynctask的doInBackground()方法中计算的。 When the interval is up the onPostExecute function calls that playAudio() function. 当间隔结束时,onPostExecute函数将调用playAudio()函数。 So after the first media file is played the app crashes. 因此,在播放第一个媒体文件后,应用程序崩溃了。 Help please! 请帮助!

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

Edit: So, after checking the logcat it seems there is this error: "Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.util.ArrayList[] at com.example.cracked.pianist.Player$2.doInBackground(Player.java:208)" 编辑:因此,在检查了logcat之后,似乎出现此错误:“由:java.lang.ClassCastException:java.lang.Object []无法转换为com.example.cracked上的java.util.ArrayList []。 pianist.Player $ 2.doInBackground(Player.java:208)“

208 is the line where Async task starts 208是异步任务开始的行

Updated code just to check the doInBackground function 更新代码只是为了检查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;
    }
}

You are passing ArrayList instead of String value for parseLong() method. 您正在传递ArrayList而不是parseLong()方法的String值。 That's why your getting class cast exception. 这就是为什么您的类强制转换为异常。

Change this 改变这个

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

to

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

and if you need any other help then let me know. 如果您需要其他帮助,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM