Android - 在后台线程中移动一个Activity

时间:2015-05-21 10:52:01

标签: android android-intent android-asynctask

每当我试图在计时器方法内完成一项活动时,活动就会一次又一次地恢复活力。 我正在开展此活动:

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)并且即将开始等等。

1 个答案:

答案 0 :(得分:1)

您的计时器会定期呼叫播放器重复启动。

如果不再需要,您必须对Timer进行取消()调用,以防止它为您的活动保留参考,从而防止从Backstack和GC中删除。

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

你的Timer没有在与它的代码相同的线程上运行,因为定时器线程是另一个线程,而定时器中的代码在UI上运行。您可以通过在runOnUIThread()之外及其内部的Timer的run方法中添加一些日志来检查它。