Android - 用于填写表单的AsyncTask

时间:2015-02-04 16:32:46

标签: android forms android-asynctask

我有一个包含9个字段的表单。当打开一个项目时,我正在调用AsyncTask以便从数据库中检索信息,现在我正在考虑如何使用该信息来填充from本身。除此之外,我还有一个全局AsyncTask,用于客户端和服务器/ DB之间的多个操作。 *我有一个全局AsyncTask的原因是我有很多小的客户端 - > DB交互使用相同的机制,所以我重复使用相同的代码。

选项1:在AsyncTask中实现一个特定的场景,向它发送额外的9个对象并对其进行处理:我承认我不喜欢这个想法,如果明天我会有一个超过9个字段的表单怎么办? / p>

选项2:在同一个类/窗口中创建一个专用的AsyncTask,这样我就可以使用AsyncTask中的对象了。这是一个更好的选择,除非有更好的选择,因此我的问题。另见上面的*评论。我丢失了重复使用的代码。

选项3:使用一个类似于窗口的类(无论如何都有它)并将其作为AsyncTask处理的一部分填充但我不知道如何从类的实例中获取信息,返回到表单

选项4:这是你发挥作用的地方:)任何建议?

1 个答案:

答案 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)。