我制作了一个音频播放器,需要向网络服务器发送一个持续的播放报告(如地理位置,歌曲名称等),当我开始播放音乐或MediaPlayer调用setOnCompletion转到下一首歌时。对于第一个循环,它运行良好,但是如果doInBackground卡住,那么它确实会在下次执行asynctask。
public void playSong()
{
mMediaPlayer.stop();
mMediaPlayer.reset();
Drawable myIcon = getResources().getDrawable( R.drawable.img_btn_pause );
pausePlay.setBackground(myIcon);
if(position == 0){
mMediaPlayer= MediaPlayer.create(getBaseContext(),R.raw.a);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.start();
songName = "IPL Tune";
}
if(position == 1){
mMediaPlayer= MediaPlayer.create(getBaseContext(),R.raw.b);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.start();
songName = "Saada Haq";
}
if(position == 2){
mMediaPlayer= MediaPlayer.create(getBaseContext(),R.raw.c);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.start();
songName = "Sadda haq(copy)";
}
new SendingData().execute();
}
AsyncTask代码
private class SendingData extends AsyncTask<Void,Void,Void>{
protected void onPreExecute(){
mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
android_id = Secure.getString(getContentResolver(),
Secure.ANDROID_ID);
}
protected void onPostExecute(Void params){
Log.d("Tesing","After Post");
super.onPostExecute(params);
}
@Override
protected Void doInBackground(Void... arg0) {
sendPost();
return null;
}
}
通过Http发布的代码
public void sendPost()
{
Log.d("Testing","in Send Post");
BufferedReader bufferedReader = null;
HttpClient httpClient = new DefaultHttpClient();
HttpPost request = new HttpPost("http://demos4clients.com/android/musicplayer/index.php");
List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("date", mydate));
postParameters.add(new BasicNameValuePair("id", android_id));
postParameters.add(new BasicNameValuePair("location", location));
postParameters.add(new BasicNameValuePair("songname", songName));
try {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(postParameters);
request.setEntity(entity);
HttpResponse response= httpClient.execute(request);
bufferedReader = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuffer stringBuffer = new StringBuffer("");
String line = "";
String LineSeparator = System.getProperty("line.separator");
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line + LineSeparator);
}
bufferedReader.close();
Log.d("Response", stringBuffer.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
Log.d("Exception of Try",e.toString());
}
finally{
if (bufferedReader != null){
try {
bufferedReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
请建议做什么,以便每次播放新歌时asynctask都能正确完成任务。是否与asynctask execute的多次调用有关?
答案 0 :(得分:0)
尝试在Asynctask中设置String而不是Void,并在logcat中测试是否从webservice获取值
答案 1 :(得分:0)
目前还不完全清楚你要在这里完成什么,但你的媒体播放器正在做什么和你的AsyncTask正在做什么之间肯定存在脱节。例如,您在主UI线程(即playSong)中设置歌曲名称,但日期和android_id由AsyncTask设置,但存储在整个(Activity?)范围内。从长期来看,这可能会导致问题,因为AsyncTask在框架自动创建的池中运行自己的线程。
请注意,就同时运行的多个实例而言,AsyncTask的操作会根据您运行的Android版本而更改。在某些版本中,它们将同时运行,在其他情况下,它们是序列化的(但仍然在一个单独的线程上。)请参阅此处的“执行顺序”部分:http://developer.android.com/reference/android/os/AsyncTask.html
另请注意,AsyncTasks不了解Android生命周期,因此如果您的活动或服务被暂停,停止或销毁,您必须妥善管理它们。
我的建议类似于sulid建议的内容:将歌曲名称传递给AsyncTask。对于给定的设备,android_id应该是常量,所以在你的活动中拉一次。您应该在预执行或doInBackground回调中同样提取日期和位置。