2016-08-15 45 views
0

我有一個android平板電腦上的應用程序,在用戶做某些事情後發送一個日誌文件給我。我已經安裝了它,能夠發送我在AsyncTask中創建的日誌文件。隨着日誌文件變得越來越大,發送所需時間也越來越長,並且我開始遇到在第一個日誌文件完成之前開始發送另一個日誌文件的問題。等待調用AsyncTask,直到前一個完成

的代碼只是

private class SendLogFile extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     //Send Log File From Tablet to Server 
    } 
} 

被稱爲用一個簡單的

new SendLogFile().execute(); 

有沒有辦法對我來說,不運行新SendLogFile的AsyncTask如果有一個當前正在執行的?我不想用定時器將其設置爲循環任務,我仍然希望它從用戶操作開始。

謝謝。

+1

或使用某種旗幟。我想如果你想防止兩個或更多的任務,這應該在UI邏輯中完成。 – 2016-08-15 22:16:23

+0

@EliDevender絕對錯誤的地方。 UI邏輯知道一個任務應該一次只執行一次? –

回答

2

你意識到你正在創造一個瓶頸,對吧?如果您在日誌文件變大時遇到問題,那麼您的方法是錯誤的。不要發送整個日誌,發送差異。

忽略 - 我不會使用AsyncTask。我會使用線程。線程圍繞並等待發送日誌消息。當它得到一個它發送它。由於它唯一的線程發送日誌,它永遠不會一次發送兩個日誌。

+0

我同意這個瓶頸,但我沒有訪問服務器端的東西,它目前只能替換文件而不是附加到當前文件。如果這種變化,我的生活變得更加容易,我同意。我會看看只使用一個線程。所有的線程對我來說還是一個新的:)。謝謝 – jhnewkirk

0

您可以使用尺寸爲1的ThreadPoolExecutor,並只提交任務。它只會一個接一個地執行。

0

沒有針對此問題的一個簡單的解決方案,使用意向的服務。 你可以根據需要執行多個任務,它會自動創建一個qeue並且一個接一個地執行,直到沒有剩下的命令,這將解決你的問題,使用我創建的這個類。

public class FeedBackSyncCommand extends IntentService { 

    public static final String ARG_LOG_FILE = "Log"; 

    /** 
    * Creates an IntentService. Invoked by your subclass's constructor. 
    * 
    * @param name Used to name the worker thread, important only for debugging. 
    */ 
    public FeedBackSyncCommand(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     String logFile = intent != null ? 
       intent.getStringExtra(ARG_LOG_FILE) : 
       "Log not available"; 

     // do stuff with your log file 
    } 
} 

你也可以使用這種方式(在開始服務的10個實例):

Intent feedBackCommand = 
       new Intent(getApplicationContext(), FeedBackSyncCommand.class); 

    for (int i = 0; i < 11; i ++) { 
     feedBackCommand.removeExtra(FeedBackSyncCommand.ARG_LOG_FILE); 
     feedBackCommand.putExtra(FeedBackSyncCommand.ARG_LOG_FILE, 
       "This is an example log file" + 1); 
     getApplicationContext().startService(feedBackCommand); 
    } 
0

我建議使用RxJava如果它是可能的,因爲邏輯流程更先進和複雜的未來。工作需要更多獨立的線程。我認爲你應該在你的工作中包含片段/活動中的一些邏輯(它們位於View和MVC模式中的控制器之間的區域)

從Gabe Sechan的回覆中,如果你可以發送diff到服務器。如果不可行,您可以將文件的當前校驗和保存在設備中。如果日誌沒有變化,至少它可以節省上傳時間 。

教程是在這裏取代asynctask。 http://blog.stablekernel.com/replace-asynctask-asynctaskloader-rx-observable-rxjava-android-patterns/