0

我有一個長時間運行的計算,它將傳感器數據作爲參數。請求後臺任務在Android中運行多次

得到計算結果後,我想調用一個方法來更新視圖。

此計算可能需要一些時間,因此我無法在Activity代碼中運行它,因爲UI線程凍結或減慢了傳感器數據。

由於我想在每次接收新傳感器數據時都運行此計算,因此Android提供了哪些選項?我試過使用AsyncTask。我將啓動一個AsyncTask以使用新的傳感器數據運行計算,並且View的更新方法將在其onPostExecute內被調用。

不幸的是這種方法產生的問題與動畫同步:一個的AsyncTask之後的下一個可以完成,並在視圖的更新將被調用與過時信息,有效地使得其動畫風聲鶴唳。

我也嘗試運行相同的AsyncTask與executeOnExecutor,將單線程執行程序傳遞給它,但這並沒有停止動畫抖動。

最後,我嘗試在MainActivity內運行帶有ResultReceiver回調的IntentService。雖然我能夠運行它,但它只運行一次。 我誤解了IntentServices的用途嗎?我似乎無法多次運行它(使用創建具有額外參數的意圖的方法並使用它調用startService)。

摘要:我有一個緩慢的方法,對傳感器數據進行操作。每次獲取新的傳感器數據時,我都想在後臺運行它,並使用其結果/響應來更新View。

有什麼建議嗎?

+0

使用的Rx的Java更新它的用戶界面和異步任務一樣工作,效果更好 –

回答

0

您服務是這裏.....

public class One extends Service { 
public static final long NOTIFY_INTERVAL = 10 * 1000; 
private Handler handler = new Handler(); 
private Timer timer = null; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() 
{ 
    if (timer != null) 
    { 
     timer.cancel(); 
    } else 
    { 
     timer = new Timer(); 
    } 
    timer.scheduleAtFixedRate(new DisplayTime(), 0, NOTIFY_INTERVAL); 
} 

class DisplayTime extends TimerTask 
{ 

    @Override 
    public void run() { 
     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       recall(); 
       Toast.makeText(getApplicationContext(), "run", Toast.LENGTH_SHORT).show(); 
      } 

     }); 
    } 
public void recall() { 

     // Write here Async Task Method...... 
    } 
}   
    @Override 
    public void onDestroy() 
    { 
    super.onDestroy(); 
    Toast.makeText(getApplicationContext(), "des", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

我的Activity如何與此服務進行通信?比如說,如果我的活動獲取傳感器數據更新,它如何將它們發送到此服務並獲得響應? – vekat

+0

我可以看到你的MainActivity代碼嗎? - @vekat –

+0

Hi @ volcano-secret,我設法使用ResultReceiver與Activity進行通信。 我沒有完全使用你的方法(我不需要TimerTask),但是使用Service的子類並使用HandlerThread爲我工作。 – vekat

0

儘管我不確定你使用的是什麼樣的動畫,這取決於你的應用程序和代碼的結構,很少的選擇可能是,而不是更新onPostExecute()中的數據,看看你是否可以在動畫的回調方法告訴你動畫已經完成,即在asynctask中計算它,但更新你的數組列表或者你在動畫的回調方法中使用的任何東西。其次,如果您對動畫需要完成多少時間有一個大致的瞭解,則可以將定時器應用於處理器,並嘗試通過延遲調用動畫來匹配這兩個操作。同樣,如果UI操作跨越活動,則可以使用廣播接收器或界面。

0

可以實現的AsyncTaskonProgressUpdate()方法,然後在你的doInBackground()你可以調用publishProgress()您可以在onProgressUpdate()