【问题标题】:Playing media using asynctask(android)使用 asynctask(android) 播放媒体
【发布时间】:2017-12-01 09:41:17
【问题描述】:

我正在尝试以不同的间隔播放媒体。 我有一个播放媒体的函数 void playAudio() 并且每当播放媒体文件时,都会执行 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;
    }
}

编辑: 因此,在检查了 logcat 之后,似乎出现了这个错误: “原因:java.lang.ClassCastException:java.lang.Object[] 无法转换为 java.util.ArrayList[] 在 com.example.cracked.pianist.Player$2.doInBackground(Player.java:208)"

208 是 Async 任务开始的行

更新代码只是为了检查 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;
    }
}

【问题讨论】:

  • 请分享代码sn-p。

标签: android android-asynctask android-mediaplayer


【解决方案1】:

您正在为 parseLong() 方法传递 ArrayList 而不是 String 值。这就是为什么你得到类转换异常。

改一下

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

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

如果您需要任何其他帮助,请告诉我。

【讨论】:

  • 感谢我理解访问错误索引所犯的错误。但是在纠正这个错误之后,同样的错误仍然存​​在:java.lang.Object[] cannot be cast to java.util.ArrayList[] at com.example.cracked.pianist.Player$2.doInBackground(Player.java:208)跨度>
  • 即使我只是简单地返回字符串的长度或返回 string[0].size 以在 onPostExecute 方法中显示 Toast 并从 doInBackground 中删除所有其他代码。应用程序崩溃并出现同样的错误。
  • 从 doInBackground 中删除所有代码,只在 log cat 中打印 string[0].get(0) 值,如果正确,那么按照我的回答可能会解决您的问题。
  • 所以我尝试了一些方法,我为 AsyncTask 创建了一个单独的 java 文件,这似乎不会导致任何问题。但是在那个 AsyncTask 中,我如何调用在调用 Activity 的线程中的公共方法 startNextFile()?
  • 创建一个新类的对象并调用该方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多