【问题标题】:Multithreading with AsyncTask(): using wait() and notify()使用 AsyncTask() 进行多线程:使用 wait() 和 notify()
【发布时间】:2013-06-20 01:30:20
【问题描述】:

我很难理解 Java 中多任务处理的工作原理。我在这里阅读了一些关于 SO 的文章,但仍然有问题。

我有我的主类,我在其中执行 AsyncTask,我想停止主类的代码执行,直到 AsyncTask 完成。在 AsyncTask 我从互联网收集数据。我想收集数据,获取结果,并在 onPostExecute() 方法中通知。这是简化的代码:

public class MainClass extends Activity  {

    public class MyTask extends AsyncTask<String, Void, String> 
    {
        @Override
        protected String doInBackground(String... arg0) {

            //(...Some calcuations here)

            synchronized (self) {
                self.notify();
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            textView.setText(result);
            //I would like to notify here, but it is not working
        }
    }

    private void callAsyncTask()
    {
        myTask = (MyTask) new MyTask().execute(someString, someOtherString);

        synchronized (self) 
        {
            try 
            {
                self.wait();
            } catch (InterruptedException e) { e.printStackTrace(); }
        }
    }

    //(...)Some code where I callAsyncTask()

}

我对使用 wait() 和 notify() 的理解是否正确?有人能解释一下我在使用这些方法时应该注意什么吗?

【问题讨论】:

  • 如果你试图停止主线程的执行,你真的违背了多线程的目的。您不妨在主线程上运行它。
  • 我想我做不到,因为从互联网收集数据需要单独的线程。
  • 为什么?如果您试图阻止主类,那么只需在主线程上运行它。否则,如果您希望它成为后台任务,则在单独的线程上运行它,但不要阻塞主线程。而是在后台线程完成后对数据做一些事情。
  • 当我尝试在主线程上从 Internet 获取数据时,我得到“NetworkOnMainThreadException”。我需要创建单独的线程来从互联网获取数据,但我不希望我的主线程代码在我完成下载数据之前执行......
  • 是的,你是对的,对此感到抱歉,但我仍然认为你不应该阻塞主线程——这就是他们首先在那里出现错误的原因。你应该重新考虑你的设计,这样你就不必阻塞主线程(我知道这不能回答你的问题,但如果你可以避免的话,我认为你不应该做你正在做的事情)。

标签: java android android-asynctask wait notify


【解决方案1】:

当你想执行异步任务时,只需在 execute() 之后使用 get()

       MyTask mytask=new MyTask (); 
       mytask.execute("arg").get();

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多