Android - 一个AsyncTask来填写表单



我有一个包含 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)。

最新更新