【问题标题】:making my thread to wait without blocking the child threads让我的线程等待而不阻塞子线程
【发布时间】:2013-10-18 09:17:38
【问题描述】:

这是我在我的 Android 应用程序中所做的示例

public OnClickListener onSelectBtnClicked = new OnClickListener() {
    @Override
    public void onClick(View v) {
        method1();
        method2();
    }
    private void method1() {
            Interface.API1();
        }

     private void method2() {
        Interface.API2();
    }

};

我在这里尝试使用外部库,因此我将调用他们的 API 来完成一些工作。现在当我点击按钮时,它会调用method1然后调用method2

这里的问题是method1被调用的时候会调用API1,API1会返回状态,但是它会在内部创建一些线程并开始一些下载任务。由于 API1 立即返回,我的程序继续执行方法 2 并开始调用 API2

我需要一种方法让我的程序等待我的 API1 完成其任务

我试过了,Thread.sleep 和 wait and notify,两者都不起作用,因为它停止了主线程并且它还暂停了 API 正在创建的线程

有什么建议可以让我的程序等待或任何其他方式来实现这一点?

【问题讨论】:

  • 为什么不使用处理程序
  • 使用一个线程,称之为 ThredManager,启动其他线程并使用倒计时同步
  • 在Android中,有AsyncTask ...

标签: java android multithreading


【解决方案1】:

你(图书馆)在使用AsyncTasks吗?

如果是这样,我认为由于 API 行为不同,您会遇到问题...

从 Honeycomb 开始,线程使用单个线程池,这意味着始终只有一个线程在运行……结果如下,如果一个线程被阻塞,所有其他线程也被阻塞…… 见http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor%28java.util.concurrent.Executor,%20Params...%29,点“执行顺序”

要解决这个问题,您(图书馆)必须使用 AsyncTask 和 THREAD_POOL_EXECUTOR...

【讨论】:

  • 现在我为什么会面临这个问题是有道理的。我不知道图书馆内部正在做什么,因为它是由不同的团队编写的。我可以在我的代码中做些什么来实现我所需要的吗?
  • 你在使用AsyncTasks吗?我认为,如果没有,您还有另一个问题...我编辑了我的帖子并删除了对线程的评论...AsyncTasks 有一个共同的线程池...如果您使用线程,它们将是独立的...然后每个线程都是一个新的并行线程......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多