使用 asynctask(android) 播放媒体
Playing media using asynctask(android)
我正在尝试以不同的时间间隔播放媒体。
我有一个播放媒体 void playAudio() 的函数,每当播放媒体文件时,都会执行异步任务以开始计算下一个媒体的时间。
间隔是在我的异步任务的 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 是异步任务开始的行
更新代码只是为了检查 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;
}
}
您正在为 parseLong() 方法传递 ArrayList 而不是 String 值。这就是为什么你得到 class 转换异常。
改变这个
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));
如果您需要任何其他帮助,请告诉我。
我正在尝试以不同的时间间隔播放媒体。 我有一个播放媒体 void playAudio() 的函数,每当播放媒体文件时,都会执行异步任务以开始计算下一个媒体的时间。
间隔是在我的异步任务的 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 是异步任务开始的行
更新代码只是为了检查 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;
}
}
您正在为 parseLong() 方法传递 ArrayList 而不是 String 值。这就是为什么你得到 class 转换异常。
改变这个
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));
如果您需要任何其他帮助,请告诉我。