Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.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
Java 使用AsyncTask()进行多线程处理:使用wait()和notify()_Java_Android_Android Asynctask_Wait_Notify - Fatal编程技术网

Java 使用AsyncTask()进行多线程处理:使用wait()和notify()

Java 使用AsyncTask()进行多线程处理:使用wait()和notify(),java,android,android-asynctask,wait,notify,Java,Android,Android Asynctask,Wait,Notify,我很难理解多任务在Java中是如何工作的。我在这里读了一些文章,但仍然有问题 我有一个主类,在其中执行AsyncTask,我想停止主类的代码执行,直到AsyncTask完成。在AsyncTask中,我从internet收集数据。我想在onPostExecute()方法中收集数据、获取结果和通知。以下是简化代码: public class MainClass extends Activity { public class MyTask extends AsyncTask<Stri

我很难理解多任务在Java中是如何工作的。我在这里读了一些文章,但仍然有问题

我有一个主类,在其中执行AsyncTask,我想停止主类的代码执行,直到AsyncTask完成。在AsyncTask中,我从internet收集数据。我想在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()

}
公共类MainClass扩展活动{
公共类MyTask扩展了AsyncTask
{
@凌驾
受保护的字符串doInBackground(字符串…arg0){
//(…这里有一些计算)
同步(自){
self.notify();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
setText(结果);
//我想在这里通知,但它不起作用
}
}
私有void callAsyncTask()
{
myTask=(myTask)new myTask().execute(someString,someOtherString);
同步(自)
{
尝试
{
self.wait();
}catch(InterruptedException e){e.printStackTrace();}
}
}
//(…)我调用AsyncTask()的一些代码
}
我对使用wait()和notify()的理解正确吗?有人能告诉我在使用这些方法时应该注意什么吗?

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

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

如果您试图停止主线程的执行,那么实际上是在违背多线程的目的。你可以在主线程上运行它。我想我不能,因为从internet收集数据需要单独的线程。为什么?如果您试图阻止主类,那么只需在主线程上运行它。否则,如果您希望它是一个后台任务,那么就在一个单独的线程上运行它,但不要阻塞主线程。而只是在后台线程完成后处理数据。当我尝试在主线程上从internet获取数据时,我得到“NetworkOnMainThreadException”。我需要创建单独的线程来从internet获取数据,但我不希望在完成数据下载之前执行主线程代码…是的,你是对的,对此表示抱歉,但我仍然认为你不应该阻止主线程-这就是为什么他们一开始就有这个错误。你应该重新考虑你的设计,这样你就不必阻塞主线程(我知道这并不能回答你的问题,但如果你能避免的话,我认为你不应该做你正在做的事情)。