2016-09-06 25 views
1

我有這樣的方法的AsyncTask類(類:ApiConnector):如何在無限循環中執行AsyncTask?

@Override 
protected String doInBackground(Void... voids) 
{ 
    return getToken(); //<-- do many the most important things and return String 
} 

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

,然後在我的活動:

new ApiConnector() 
{ 
    @Override 
    public void onPostExecute(String result) 
    { 
     Log.d("here: ", result); 
    } 
}.execute(); 

它工作的很好,當我執行這一次,但我必須在無盡的循環中做到這一點,以便像市場上新鮮的蘋果一樣總是採用新鮮的標記。我試過類似的東西:

while (true) 
{ 
    new ApiConnector() 
    { 
     @Override 
     public void onPostExecute(String result) 
     { 
      Log.d("here!", result); 
     } 
    }.execute(); 
    Thread.sleep(1000); 
} 

和許多很多愚蠢的事情,但我找不到工作方式。所有線程bussiness對我來說都很棘手。給我一些踢球,我肯定會處理。

+1

在循環中調用異步?這是一個非常糟糕的決定。使用'Timer'或'Handler'來更新您的令牌或任何給定的時間。你也可以'callOnExecutor()'AsyncTask並行運行多線程 – hrskrs

+0

我第一次在android中寫東西,所以對我來說非常不好的決定是正常的。感謝您的幫助,我將詳細瞭解Timer或Handler。 –

回答

0

hrskrs評論我更喜歡用Handler來反覆執行某些操作。主要優點是postDelayed使run()方法在主應用程序線程中執行 - 因此您可以訪問和更改UI組件。

下面是一個例子:

public class MyTest implements Runnable { 
    private final static int INTERVAL = 5000; 

    private Handler mHandler; 

    private MyTest() { 
     mHandler = new Handler(); 
    } 

    public void start() { 
     run(); 
    } 

    public void stop() { 
     mHandler.removeCallbacks(this); 
    } 

    @Override 
    public void run() { 
     // put here the logic that you want to be executed 
     mHandler.postDelayed(this, INTERVAL); 
    } 
} 
0

你不想這樣做。所有AsyncTasks都在一個線程上運行。如果你在一個AsyncTask中無限循環,你將會捱餓所有其他任務。如果你有每項任務開始一項新任務,那麼你仍然會面臨嚴重的飢餓問題。

如果你想這樣做(我不確定你是否真的這樣做,但讓我們忽略它),正確的方法是使用一個線程。一個線程在結束時可以有一個巨大的while(true)循環和一個sleep語句。

+0

使用線程是一個問題,例如: http://stackoverflow.com/questions/7857343/asynctask-cannot-work-in-thread-android 我沒有寫它,但getToken()只是一個愚蠢的名字 - 在現實生活中,我需要做很多事情,比如下載json和其他東西(現在不重要)。像寫入方法downloadJson簡單的解決方案沒有工作,因爲我不能做這樣的東西在android主線程活動。我得到了「正確的方式」來做到這一點在AsyncTask(更好的不改變),但我想刷新我的JSON 30秒,現在我得到的問題 - 如何做到這一點與奇怪的AsyncTask。 –

+0

首先,這個問題是由不明白他們在做什麼的人編寫的 - 一個asynctask可以從一個線程中調用。其次,你會使用一個線程*而不是一個AsyncTask。一個AsyncTask是你想要的錯誤解決方案。 –