我有一个包含9个字段的表单。当打开一个项目时,我正在调用AsyncTask以便从数据库中检索信息,现在我正在考虑如何使用该信息来填充from本身。除此之外,我还有一个全局AsyncTask,用于客户端和服务器/ DB之间的多个操作。 *我有一个全局AsyncTask的原因是我有很多小的客户端 - > DB交互使用相同的机制,所以我重复使用相同的代码。
选项1:在AsyncTask中实现一个特定的场景,向它发送额外的9个对象并对其进行处理:我承认我不喜欢这个想法,如果明天我会有一个超过9个字段的表单怎么办? / p>
选项2:在同一个类/窗口中创建一个专用的AsyncTask,这样我就可以使用AsyncTask中的对象了。这是一个更好的选择,除非有更好的选择,因此我的问题。另见上面的*评论。我丢失了重复使用的代码。
选项3:使用一个类似于窗口的类(无论如何都有它)并将其作为AsyncTask处理的一部分填充但我不知道如何从类的实例中获取信息,返回到表单
选项4:这是你发挥作用的地方:)任何建议?
答案 0 :(得分:0)
我没有完整的发布示例,但我过去曾使用过任务模式。
首先,您创建了一个可以传递给AsyncTask
的小占位符 - 您希望确保将UI活动与后台活动分开;在这里它执行()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)。