2016-08-15 46 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/