草庐IT

java - Thread.sleep 停止所有嵌套的异步任务

coder 2023-12-20 原文

我正在关注 codelearn 的教程,并尝试创建一个 AsyncTask,它生成推文并执行另一个 AsyncTask 以写入缓存文件。 我有 Thread.sleep,因此首次加载时的 UI 会等待推文写入缓存文件。首先我执行 AysncTask new AsyncWriteTweets(this.parent).execute(tweets); 然后 hibernate 10 秒。

但在 logcat 中,我可以看到 AsyncWriteTweets 也会在 10 秒 sleep 后执行。因此 onPostExecute 在将推文写入缓存文件之前执行,给出一个空白屏幕。

public class AsyncFetchTweets extends AsyncTask<Void, Void, Void> {
    private TweetListActivity parent;
    ArrayList<Tweet> tweets = new ArrayList<Tweet>();
    ArrayList[] temp;

    public AsyncFetchTweets(TweetListActivity parent){
        this.parent = parent;
    }

    @Override
    protected Void doInBackground(Void... params) {
        int result = 0;
        Log.d("ASync", "Calling asycn");
        for (int i=0;i<4;i++){
            Tweet tweet = new Tweet();
            tweet.setTitle("Title Async Very New" + i);
            tweet.setBody("Body text for tweet no " + i);
            tweets.add(tweet);
        }
        new AsyncWriteTweets(this.parent).execute(tweets);

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void result){
        Log.d("Async", "on Post execute");
        this.parent.renderTweets();
    }

}

PS: My assumption is AsyncTask should create a new thread, hence Thread.sleep in parent should not stop child. If it is otherwise please advise how can I overcome this issue.

最佳答案

这个:

new AsyncWriteTweets(this.parent).execute(tweets);

是错误的,AsyncTask 必须在 UI 线程而不是 Worker 线程上执行。您可以使用 Handler 和 post runnable 来安全地执行它。

引用线程规则:

execute(Params...) must be invoked on the UI thread.

http://developer.android.com/reference/android/os/AsyncTask.html

上述链接的另一部分是Order of execution, :

Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

因此您的第一个异步任务必须在下一个异步任务开始之前结束,但是您可以通过使用带有 THREAD_POOL_EXECUTOR 的 executeOnExecutor(java.util.concurrent.Executor, Object[]) 来恢复之前的并行行为。 execute 必须在 UI 线程上完成。

关于java - Thread.sleep 停止所有嵌套的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31168566/

有关java - Thread.sleep 停止所有嵌套的异步任务的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  7. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  8. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  9. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  10. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

随机推荐