我有一个包含 9 个字段的表单。打开项目时,我正在调用 AsyncTask 以从数据库中检索信息,现在我正在考虑该怎么做才能使用信息来填充自身。除此之外,我还有一个全局 AsyncTask,用于客户端和服务器/DB 之间的多个操作。* 我有一个全局 AsyncTask 的原因是我有很多具有相同机制的小型客户端>数据库交互,因此我重用相同的代码。
选项 1:在该 AsyncTask 中实现一个特定场景,向其发送额外的 9 个对象并对其进行处理: 我承认我不喜欢这个想法,如果明天我将有一个超过 9 个字段的表单怎么办?
选项 2:在同一类/窗口中创建一个专用的 AsyncTask,以便我可以使用 AsyncTask 中的对象。除非有更好的选择,否则这是一个更好的选择,因此我的问题。另请参阅我上面的 * 评论。我丢失了代码重用。
选项 3:使用一个结构类似于窗口的类(无论如何我都有它)并将其填充为 AsyncTask 处理的一部分,但我不知道如何将类实例中的信息带回表单。
选项 4:这就是您发挥作用的地方:)有什么建议吗?
完整的示例可以发布,但我过去使用过任务模式。
首先,你创建一个可以传递给AsyncTask
的小占位符——你要确保将UI活动与后台活动分开;这里是'execute()for the background, and
deliverResult()for the UI thread. I use a
WeakReference'以避免资源泄漏,尤其是在刷新活动时。
abstract class Task {
abstract boolean execute();
abstract void deliverResult();
}
class QueryTask extends Task {
private WeakReference<TextView> mView;
private String mQuery;
private int mResult;
public QueryTask( String query, TextView view ) {
mView = new WeakReference<TextView>( view );
mQuery = query;
}
public boolean execute() {
// run query
mResult = query-result;
return true;
}
void deliverResult() {
TextView view = mView.get();
if( view != null )
view.setText( String.valueOf( mResult ) );
}
接下来,创建一个AsyncTask
来处理任务列表。在这里,您可以使用onProgressUpdate()
来更新 UI 线程上的 UI:
class TaskWorker extends AsyncTask<Task, Task, Void> {
@Override
protected Void doInBackground(Task... params) {
for( int i=0; i<params.length; i++ ) {
Task task = params[i];
if( task.execute() )
publishProgress( task );
}
return null;
}
@Override
protected void onProgressUpdate(Task... values) {
for( int i=0; i<value.length; i++ ) {
values[i].deliveryResult();
}
}
}
所有这些都可以存在于一个类中,您可以在代码中的任何位置访问/重用该类。假设你把它放在类Tasks
中,然后你会执行它:
Tasks.TaskWorker worker = new Tasks.TaskWorker();
worker.execute(
new Tasks.QueryTask( "SELECT COUNT(*) FROM EMPLOYEES", tvEmpCount ),
new Tasks.QueryTask( "SELECT SUM(SALARY) FROM EMPLOYEES", tvTotalSalary ),
new Tasks.DownloadTask( "http://avatar.jpg", imgEmp ) );
然后,这将一次执行一个查询,填充 UI,最后下载图像(如果实现了 DownloadTask)。