如果AsyncTask不是一个内部类… – 一些问题

1)我不会为什么Android的样本几乎使用AsyncTasks作为私有的内部类。 我知道使它成为内部类是很方便的,但是这使得我们的类文件变得更长,更难以阅读 。 货架上活动的样品申请甚至有845行。 你不觉得这是一个糟糕的devise或糟糕的build设吗?

2)如果我制作了我的ScanStorageTask外部类,那我该怎么传递给它呢? 整个活动还是只使用小部件?

示例:如果我必须在ScanStorageTask中使用WebView,Button和ProgressBar。 我使用这个:

ScanStorageTask task = new ScanStorageTask(this); // "this" is activity reference, then get the webView, button, progressBar from it. 

或这个:

 ScanStorageTask task = new ScanStorageTask(webView, button, progressBar); 

Solutions Collecting From Web of "如果AsyncTask不是一个内部类… – 一些问题"

在外部做这件事没什么问题,实际上它可能是一个更好的devise。 传递UI元素是一种紧密的耦合,无论如何,当你拥有一个非常庞大的代码库时,它会让你陷入困境。

为什么不在外部使用UI控件所使用的“侦听器”模式? 使您的ScanStorageTask自己的类,使用onComplete方法创build一个OnCompleteListener接口,并将其传递给您的ScanStorageTask实例(公开setOnCompleteListener方法或类似的东西)。 然后,onPostExecute可以做到这一点:

 if(onCompleteListener != null) onCompleteListener.onComplete(data); 

这样,您可以根据数据在您的活动中定义UI更新。 这是更好的分离的问题,并会保持你的代码,每个类的代码行,因为这似乎是你想要的。 如果你还没有这样做,那么创build一个代表你需要传入和传出的数据的类,这就是你传递给该任务的参数,作为执行方法的参数以及onPostExecute传递给onComplete的内容。

内部类允许您在onPreExecute()onPostExecute()onProgressUpdate()内部操作外部Activity的UI,而不将整个UI结构传递给AsyncTask。 你只能使用activites函数。

这很有用,因为操纵UI不是AsyncTask的主要目的。 它正在做非UI后台工作。 为此,你通常需要通过一些参数来完成这项工作(例如提供一个URL来下载文件)。

当你声明你的AsyncTask是外部的时候,你基本上不能访问onPreExecute()里面的UI资源(根本没有parameter passing给它),而在其他两个UI函数里面很难。

我会说AsyncTask只是作为一个内部类来做工作和更新UI线程的beeing。 请参阅说明:

AsyncTask支持正确和简单地使用UI线程。 这个类允许执行后台操作并在UI线程上发布结果,而不必操作线程和/或处理程序。

(从类文档 )

我可能在应用程序中遇到同样的问题。 我想用一个Socket与PCbuild立一个联系,我希望我的代码可以从几个Activities / Fragments中重用。

首先,我尝试不使用内部类,但是当你不得不更新UI的时候非常方便,所以我find了一个替代解决scheme:
我创build了一个外部的AsyncTask类,负责与pc进行通信,我在每个onPostExecute() / fragments中创build了内部类,只重写了onPostExecute()方法。 这样我可以重用我的代码并更新UI。

如果您只想获取任务的结果,并且响应对您的应用程序不是必需的,则可以使用AsyncTask类的get()方法。

  1. 就我个人而言,我相信,如果你只在某一点上使用类,那么在那里定义它也是最可读的 – 因此是内在的类。

  2. 不要紧。 从devise的angular度来看,我只会传递实际需要的数据。 然而,你需要注意一个可能的陷阱 – 当活动实例被取消激活(隐藏或方向改变),你的后台线程仍然运行,并试图显示一些变化,那么你可以得到各种错误或什么都没有显示。