AsyncTask无法正常运行

时间:2013-11-26 12:08:02

标签: android android-asynctask http-post

我制作了一个音频播放器,需要向网络服务器发送一个持续的播放报告(如地理位置,歌曲名称等),当我开始播放音乐或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的多次调用有关?

2 个答案:

答案 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回调中同样提取日期和位置。