Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 等待调用AsyncTask,直到前一个任务完成_Android_Android Asynctask - Fatal编程技术网

Android 等待调用AsyncTask,直到前一个任务完成

Android 等待调用AsyncTask,直到前一个任务完成,android,android-asynctask,Android,Android Asynctask,我在安卓平板电脑上有一个应用程序,在用户做某些事情后,它会向我发送一个日志文件。我已经安装了它,能够发送我在异步任务中创建的日志文件。随着日志文件越来越大,发送所需的时间也越来越长,我开始遇到这样一个问题:在第一个日志文件完成之前,它开始发送另一个日志文件 代码很简单 private class SendLogFile extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackgrou

我在安卓平板电脑上有一个应用程序,在用户做某些事情后,它会向我发送一个日志文件。我已经安装了它,能够发送我在异步任务中创建的日志文件。随着日志文件越来越大,发送所需的时间也越来越长,我开始遇到这样一个问题:在第一个日志文件完成之前,它开始发送另一个日志文件

代码很简单

private class SendLogFile extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        //Send Log File From Tablet to Server
    }
}
如果当前正在执行一个新的SendLogFile异步任务,有没有办法不运行该任务?我不想将其设置为带有计时器的定期任务,我仍然希望它从用户操作开始


谢谢。

你意识到你在这里制造了一个瓶颈,对吗?如果您在日志文件变大时遇到问题,那么您的方法是错误的。不要发送整个日志,发送差异


忽略这一点-我不会使用异步任务。我会用一根线。线程坐在那里等待发送日志消息。当它得到一个,它就会发送它。因为它是唯一一个线程发送日志,所以它不可能同时发送两个日志。

您意识到您在这里制造了一个瓶颈,对吗?如果您在日志文件变大时遇到问题,那么您的方法是错误的。不要发送整个日志,发送差异


忽略这一点-我不会使用异步任务。我会用一根线。线程坐在那里等待发送日志消息。当它得到一个,它就会发送它。因为它是唯一的线程发送日志,所以它永远不能同时发送两个日志。

您可以使用大小为1的,只需向其提交任务即可。它只能一个接一个地执行。

您可以使用大小为1的,只需向其提交任务即可。它只会一个接一个地执行。

调用
newSingleThreadExecutor()
并在返回的执行器上运行
异步任务

调用
newSingleThreadExecutor()
并在返回的执行器上运行
AsyncTask

这个问题有一个简单的解决方案,使用Intent服务。 您可以执行任意数量的命令,它将自动创建一个QUE,并一个接一个地执行它,直到没有剩余的命令为止,这将解决您的问题,使用我创建的这个类

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反馈命令=
新的意图(getApplicationContext(),FeedBackSyncCommand.class);
对于(int i=0;i<11;i++){
removeExtra(FeedBackSyncCommand.ARG_LOG_文件);
feedBackCommand.putExtra(FeedBackSyncCommand.ARG_LOG_文件,
“这是一个示例日志文件”+1);
getApplicationContext().startService(feedback命令);
}

这个问题有一个简单的解决方案,使用Intent服务。 您可以执行任意数量的命令,它将自动创建一个QUE,并一个接一个地执行它,直到没有剩余的命令为止,这将解决您的问题,使用我创建的这个类

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反馈命令=
新的意图(getApplicationContext(),FeedBackSyncCommand.class);
对于(int i=0;i<11;i++){
removeExtra(FeedBackSyncCommand.ARG_LOG_文件);
feedBackCommand.putExtra(FeedBackSyncCommand.ARG_LOG_文件,
“这是一个示例日志文件”+1);
getApplicationContext().startService(feedback命令);
}

如果可能的话,我建议使用RxJava,因为未来的逻辑流程更高级、更复杂。这项工作需要更多的独立线程。我认为您应该在片段/活动中为您的工作包含一些逻辑(它们位于MVC模式中视图和控制器之间的区域)

从Gabe Sechan的回答来看,如果您可以将差异发送到服务器,那就太好了。如果不可能,您可以在设备中保存文件的当前校验和。至少它可以帮你节省上传的时间 如果日志中没有更改

本教程用于替换异步任务。

如果可能的话,我建议使用RxJava,因为未来的逻辑流程更高级、更复杂。这项工作需要更多的独立线程。我认为您应该在片段/活动中为您的工作包含一些逻辑(它们位于MVC模式中视图和控制器之间的区域)

从Gabe Sechan的回答来看,如果您可以将差异发送到服务器,那就太好了。如果不可能,您可以在设备中保存文件的当前校验和。至少它可以帮你节省上传的时间 如果日志中没有更改

本教程用于替换异步任务。

或使用某种标志。我认为如果你想阻止两个或更多的任务,这应该在UI逻辑中完成。@EliDevender绝对是错误的位置。UI逻辑如何知道一个任务一次只能执行一次?或者使用某种标志。我认为如果你想阻止两个或更多的任务,这应该在UI逻辑中完成。@EliDevender绝对是错误的位置。UI逻辑如何知道一个任务一次只能执行一次?我同意这个瓶颈,但我没有访问服务器端的权限,它目前只能替换文件,而不能附加到当前文件。我同意,如果这种情况改变了,我的生活就会轻松得多。我将仅使用一个线程来查看。所有的线程对我来说还是有点陌生:)。谢谢,我同意这个瓶颈,但我没有访问服务器端的权限,它目前只能替换文件,而不能附加到当前文件中。我同意,如果这种情况改变了,我的生活就会轻松得多。我将仅使用一个线程来查看。所有的线程对我来说还是有点陌生:)。谢谢
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);
    }