2015-05-21 2 views
0

Каждый раз, когда я пытаюсь закончить действие внутри метода таймера, активность снова и снова возвращается. Я выполнение этой деятельности:Android - перемещение активности внутри фоновой темы

public class PlayerNoAdmin extends ActionBarActivity { 

    Timer myTimer; boolean isAdmin; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player_no_admin); 

     Intent oldIntent = getIntent(); 
     if (oldIntent != null && oldIntent.hasExtra("THE_LIST")){ 
      songs = oldIntent.getParcelableArrayListExtra("THE_LIST"); 
      id = oldIntent.getIntExtra("ID",0); 
      listId = oldIntent.getIntExtra("LIST_ID",0); 
      isAdmin = oldIntent.getBooleanExtra("IS_ADMIN",false); 
     } 

     //update the list every k seconds 
     myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       TimerMethod(); 
      } 

     }, 0, k_time2Update); 
    } 

    private void TimerMethod() { 
     //This method is called directly by the timer 
     //and runs in the same thread as the timer. 

     //We call the method that will work with the UI 
     //through the runOnUiThread method. 
     this.runOnUiThread(Timer_Tick); 

    } 

    private Runnable Timer_Tick = new Runnable() { 
     public void run() { 
      //Here check for update in the list every 30 seconds and send the new location 
      String url = getRunUrl(); 
      new TaskMusicPlay().execute(url); 
     } 
    }; 

    private class TaskMusicPlay extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 

      String jsonResult = null; 
      try { 
       String url = params[0]; 
       TestMain client = new TestMain(); 
       jsonResult = client.doGetRequest(url); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return jsonResult; 
     } 

     @Override 
     protected void onPostExecute(String aVoid) { 
      super.onPostExecute(aVoid); 
      checkIfNew(aVoid); 
     } 

     private void checkIfNew(String result) { 
      try { 
       JSONObject object = new JSONObject(result); 
       String temp = object.getJSONObject("info").getString("isAdmin"); 
       isAdmin = (temp.equals("true")); 
        if (isAdmin) { 
         Intent intent = new Intent(getApplication(),YouTubePlayer.class); 
         intent.putExtra("THE_LIST", songs); 
         intent.putExtra("ID", id); 
         intent.putExtra("LIST_ID",listId); 
         intent.putExtra("IS_ADMIN",isAdmin); 
         startActivity(intent); 
         finish(); 
        } 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

В конце концов, мне удалось перейти к деятельности YouTubePlayer, но каждые несколько секунд приложение возвращается к коду этой деятельности (и затем снова выполняют вызов startActivity и возвращаются на YouTubePlayer), и это продолжается и продолжается.

+0

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

+0

@IljaKO спасибо, ты знаешь, как я могу остановить таймер? или прекратить вызов этой операции? –

+0

Я даю вам ответ –

ответ

1

Ваш таймер периодически призывает игрока начать снова и снова.

Вы должны сделать вызов cancel() на Таймер, если он больше не нужен, чтобы вы не смогли сохранить ссылку для своей деятельности и, таким образом, не могли быть удалены из задней части и GC.

http://developer.android.com/reference/java/util/Timer.html

И ваш таймер не работает в том же потоке, как это код, так как поток таймера Iis другой поток и код в таймере на пользовательском интерфейсе. Вы можете проверить это, добавив несколько журналов в метод запуска Timer вне runOnUIThread() и внутри него.

+0

спасибо! что сработало –

Смежные вопросы