Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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(或AsyncResult),它通常如何用于Android?_Java_Android - Fatal编程技术网

Java 什么是AsyncTask(或AsyncResult),它通常如何用于Android?

Java 什么是AsyncTask(或AsyncResult),它通常如何用于Android?,java,android,Java,Android,找不到关于这个概念的太多信息。已经提到 Edit:我认为我所指的AsyncResult是用于保存泛型结果的特定名称。(后台操作,完成后将异步通知用户。) 上面的链接似乎只是这个概念的具体实现。 有关参考,请参见以下内容: 背景/理论 AsyncTask允许您在后台线程上运行任务,同时将结果发布到UI线程 用户应始终能够与应用程序交互,因此它非常重要 避免使用以下任务阻塞主(UI)线程 从网上下载内容 这就是我们使用异步任务的原因 它通过包装UI线程消息队列和处理程序提供了一个简单的界面

找不到关于这个概念的太多信息。已经提到

Edit:我认为我所指的AsyncResult是用于保存泛型结果的特定名称。(后台操作,完成后将异步通知用户。)

上面的链接似乎只是这个概念的具体实现。
有关参考,请参见以下内容:

背景/理论 AsyncTask允许您在后台线程上运行任务,同时将结果发布到UI线程

用户应始终能够与应用程序交互,因此它非常重要 避免使用以下任务阻塞主(UI)线程 从网上下载内容

这就是我们使用异步任务的原因

它通过包装UI线程消息队列和处理程序提供了一个简单的界面,允许您发送和处理来自其他线程的可运行对象和消息

实施 AsyncTask是一个泛型类。(它在构造函数中使用参数化类型

它使用以下三种通用类型:

参数
-执行时发送到任务的参数类型

进度
-后台计算期间发布的进度单位类型

结果
-背景计算结果的类型

异步任务并不总是使用所有类型。要将类型标记为未使用,只需使用类型Void:

私有类MyTask扩展了AsyncTask{…}

这三个参数对应于三个主要功能,您可以在
异步任务中覆盖:

  • doInBackground(参数…)
  • onProgressUpdate(进度…)
  • onPostExecute(结果)
执行异步任务

调用
execute()
,并将参数发送到后台任务

发生了什么

  • 在主/UI线程上,调用onPreExecute()
  • 。(初始化此线程中的某些内容,例如在用户界面上显示进度条。)

  • 在后台线程上,调用doInBackground(Params…。(参数是传递给执行函数的参数。)

    • 长时间运行的任务应该发生在哪里

    • 必须至少重写
      doInBackground()
      才能使用AsyncTask

    • 调用
      publishProgress(Progress…
      在后台计算仍在执行时更新用户界面中的进度显示。(例如,制作进度条动画或在文本字段中显示日志。)

      • 这将导致调用onProgressUpdate()
  • 在后台线程上,从
    doInBackground()
    返回一个结果。这将触发下一步

  • 在主/UI线程上,调用onPostExecute()并返回结果

  • 例子 再举一个阻止任务的例子,从网络上下载一些东西

    • 示例A下载图像并将其显示在ImageView中
    • 示例B下载了一些文件
    例A
    doInBackground()
    方法下载图像并将其存储在位图类型的对象中。
    onPostExecute()
    方法获取位图并将其放置在ImageView中

    class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bitImage;
    
        public DownloadImageTask(ImageView bitImage) {
            this.bitImage = bitImage;
        }
    
        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mBmp = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mBmp = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mBmp;
        }
    
        protected void onPostExecute(Bitmap result) {
            bitImage.setImageBitmap(result);
        }
    }
    

    你为什么需要这个?它没有多大用处,还带有
    @hide
    的注释,意思是“不供公众使用”。你发布的两个链接根本不是一回事,@worldssender,在我看到的版本中,它没有注释hidden@ci_是的,我意识到这一点,我在寻找对概念或模式的解释,也许用安卓系统example@tbone,在您提供的第一个链接中
     private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                 totalSize += Downloader.downloadFile(urls[i]);
                 publishProgress((int) ((i / (float) count) * 100));
                 // Escape early if cancel() is called
                 if (isCancelled()) break;
             }
             return totalSize;
         }
    
         protected void onProgressUpdate(Integer... progress) {
             setProgressPercent(progress[0]);
         }
    
         protected void onPostExecute(Long result) {
             showDialog("Downloaded " + result + " bytes");
         }
     }
    
    new DownloadFilesTask().execute(url1, url2, url3);