2012-03-08 2 views
2

Мне нужно знать, как запустить мою AsyncTask, которая находится в моем первоначальном действии, из службы, которую запускает эта активность. Он извлекает музыку и воспроизводит его в службе, и я хочу, чтобы захватить следующую песню после того, как он закончил здесь:Создание AsyncTask Static (наличие проблем, код предоставлен)

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
    {   
     public void onCompletion(MediaPlayer mp) 
     {    
      if (MainMenu.radioFlag == 1) { 
       // Start new asynctask 
      } else { 
      stopSelf(); 
      } 
     }   
    }); 

Внизу мой AsyncTask, в моем Radio.class. Я не знаю, как сделать его статическим со ссылками на Radio.this, и я также получал ошибки при запуске службы (i) и stopService (i). Я бы очень признателен за помощь, спасибо.

private class LoadList extends AsyncTask<String, UserRecord, JSONArray> { 

    String result = null; 
    InputStream is = null; 
    StringBuilder sb = null; 
    JSONArray jArray; 

    @Override 
    protected void onCancelled() { 
     Toast toast = Toast.makeText(getApplicationContext(), "Loading failed, trying again", Toast.LENGTH_LONG); 
     toast.show(); 
     new LoadList().execute(linkurl); 
    } 

    protected JSONArray doInBackground(String... link) { 

     linkurl = link[0]; 
     URI uri = null; 
     try { 
      uri = new URI(link[0]); 
     } catch (URISyntaxException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 

     //http post 
     try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(uri); 
      //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
     }catch(Exception e){ 
      Log.e("log_tag", "Error in http connection"+e.toString()); 
     } 

     //convert response to string 
     try{ 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF8"),8); 
      sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 

      String line="0"; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      result=sb.toString(); 
     }catch(Exception e){ 
      Log.e("log_tag", "Error converting result "+e.toString()); 
     } 

     if (result == null) { 
      linkurl = link[0]; 
      cancel(true);     
     } else { 

     try{ 
      jArray = new JSONArray(result); 
      JSONObject json_data=null; 

      displayname = new String[jArray.length()]; 
      song_name = new String[jArray.length()]; 
      artist = new String[jArray.length()]; 
      description = new String[jArray.length()]; 
      genre = new String[jArray.length()]; 
      custom_genre = new String[jArray.length()]; 
      album = new String[jArray.length()]; 
      timestamp = new String[jArray.length()]; 
      song_id = new String[jArray.length()]; 
      avatar = new String[jArray.length()]; 
      test_rating = new Float[jArray.length()]; 
      songurl = new String[jArray.length()]; 
      viewss = new String[jArray.length()]; 
      section = new String[jArray.length()]; 
      plays = new String[jArray.length()]; 
      downloads = new String[jArray.length()]; 
      ratingcount = new String[jArray.length()]; 
      commentcount = new String[jArray.length()]; 
      dlFlag = new int[jArray.length()]; 
      link1 = new String[jArray.length()]; 
      link2 = new String[jArray.length()]; 
      link3 = new String[jArray.length()]; 
      link4 = new String[jArray.length()]; 
      link5 = new String[jArray.length()]; 

      for(int i=0;i<jArray.length();i++){ 
       json_data = jArray.getJSONObject(i); 
       song_id[i]=json_data.getString("id"); 
       song_name[i]=json_data.getString("songname"); 
       artist[i]=json_data.getString("artist"); 
       displayname[i]=json_data.getString("displayname"); 
       description[i]=json_data.getString("description"); 
       genre[i]=json_data.getString("genre"); 
       custom_genre[i]=json_data.getString("customgenre"); 
       album[i]=json_data.getString("album"); 
       timestamp[i]=json_data.getString("format"); 
       avatar[i]=json_data.getString("image_url"); 
       songurl[i]=json_data.getString("song_url"); 
       test_rating[i] = (float) json_data.getDouble("rating"); 
       viewss[i] = json_data.getString("views"); 
       section[i] = json_data.getString("section"); 
       plays[i] = json_data.getString("plays"); 
       downloads[i] = json_data.getString("downloads"); 
       ratingcount[i] = json_data.getString("rating_count"); 
       commentcount[i] = json_data.getString("comments"); 
       dlFlag[i] = json_data.getInt("downloadflag"); 
       link1[i] = json_data.getString("link1"); 
       link2[i] = json_data.getString("link2"); 
       link3[i] = json_data.getString("link3"); 
       link4[i] = json_data.getString("link4"); 
       link5[i] = json_data.getString("link5");     
      } 
     } 
     catch(JSONException e1){ 
      e1.printStackTrace(); 

     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     }   
     } 
     return null; 
    } 

    protected void onProgressUpdate(UserRecord... progress) { 

    } 

    protected void onPostExecute(JSONArray jArray) {                    
     i.putExtra("songURL", songurl[0]); 
     i.putExtra("songNAME", displayname[0]); 

     MainMenu.radioFlag = 1; 

     ratingBar.setRating(0); 

     tvTrack.setText(displayname[0]); 

     if(dialog.isShowing()) { 
      dialog.dismiss(); 
      } 
     if(MainMenu.serviceRunning == 1) { 
      stopService(i); 
      startService(i); 
     } else { 
      startService(i); 
     } 

     tvTime.setText(timestamp[0]); 
     tvViews.setText(viewss[0]); 
     tvComments.setText(commentcount[0]); 
     tvRatings.setText(ratingcount[0]); 
     tvPlays.setText(plays[0]); 
     tvDownloads.setText(downloads[0]); 

     if(description[0] == "null" || description[0] == ""){                
      viewDesc.setVisibility(View.GONE); 
      viewDesc2.setVisibility(View.GONE); 
      descriptionTitle.setVisibility(View.GONE); 
      tvDescription.setVisibility(View.GONE); 
     } else { 
      viewDesc.setVisibility(View.VISIBLE);  
      descriptionTitle.setVisibility(View.VISIBLE); 
      tvDescription.setVisibility(View.VISIBLE); 
      tvDescription.setText(description[0]); 
      viewDesc2.setVisibility(View.VISIBLE); 
     } 


       }         

    protected void onPreExecute(){  


     dialog = ProgressDialog.show(Radio.this, "", 
        "Loading. Please wait...", true);         
    } 
} 

ответ

2

Вы не хотите, чтобы сделать AsyncTask статические, даже если вы могли бы. Каждый экземпляр хорош для одного выстрела и больше никогда не может быть запущен.

Кажется, у вас есть честная связь между вашими Activity и Service. В такой ситуации вы должны заглянуть в binding the service to your activity. У вас будет простой канал для вызова методов туда и обратно, или вы можете настроить каналы Message и Handler, если хотите делать асинхронно.

+0

Я хочу, чтобы моя служба, чтобы продолжать работать, когда заканчивается деятельность и создать новый AsyncTask каждый раз, так что это может быть выбежала несколько раз. –

+0

Верните 'START_STICKY' из вашего метода' onStartCommand() 'и' Service' будет придерживаться до тех пор, пока вы явно не убьете его, или ОС не окажется в жестоком настроении. – Argyle

+0

Знаете ли вы, как я могу сделать это статическое, чтобы я мог играть с ним так, как сейчас? –

1

Вы можете легко объявить его как статичный.

Вам просто нужно передать ссылку на деятельность, чтобы вы могли получить доступ к ее членам.

Если вы статируете его, вы потеряете доступ к членам экземпляра внешнего класса, поэтому просто сохраните ссылку на деятельность самостоятельно, передав ее конструктору вашей AsyncTask, а затем проверив его для null до того, как вы его получите.

Я также рекомендую сделать ему WeakReference, а:

  • Дискуссионного Преимуществом этого является то, что AsyncTask не будет содержать ссылку родительской деятельности (внутренние классы в Java получить сильный реф Назад к родительскому, если они не являются статическими).

  • Это позволит осуществлять деятельность GC'ed (сбор мусора) в случае, если пользователь переключает экраны.

  • В противном случае он будет храниться в памяти, до тех пор, пока AsyncTask не закончит и не выпустит ссылку.

Вот пример кода

private static class StatusLoader extends AsyncTask <Boolean, Void, ServiceStatus> { 
    WeakReference<StatusActivity> _act; 
    StatusLoader(StatusActivity pActivity) { 
     _act = new WeakReference<StatusActivity>(pActivity); 
    } 

    @Override 
    protected ServiceStatus doInBackground(Boolean... params) { 
     ServiceStatus retval = null; 
     boolean bUseCache = params[0]; 
     retval = StatusMgr.getStatus(bUseCache); // do work... 
     return retval; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     StatusActivity act = _act.get(); 
     if (act != null) { 
      act._mData.showProgress(U.getStringRes(R.string.progress_msg_status_update)); 
     } 
    } 
    @Override 
    protected void onPostExecute(ServiceStatus pResult) { 
     super.onPostExecute(pResult); 
     StatusActivity act = _act.get(); 
     if (act != null) { // <-- in case activty is no longer alive 
      act._dsStatus = pResult; 
      act._mData.hideProgress(); 
      act._mData.bindStatusData(StatusMgr.getResultMode()); 
     } 
    } 
} 
Смежные вопросы