1

通常我在 postExecute 方法中更新 UI。
例如

public class SampleActivity extends Activity{
TextView textSample;
@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.aadd_addtocheck);
        textSample = (TextView) findViewById(R.id.lin);
                STask sampleTask = new Stask();
                sampleTask.execute();
}
class GetAdd extends AsyncTask<Void, Void, JSONObject> {


        @Override
        protected JSONObject doInBackground(Integer... params) {
            // TODO Auto-generated method stub
            UserFunctions u = new UserFunctions();
            return u.getNewAdd();
        }

        @Override
        protected void onPostExecute(JSONObject result) {
            super.onPostExecute(result);
                    textSample.setText(result.getString("Something");
}

但是,我的 asyncTask 变大了,我想将它们移动到不同的类(在它们成为子类之前)。因此,我想知道当 asynctask 将是一个单独的类时如何更新 UI(比如设置 texviews)。

4

3 回答 3

2

您将Context,Activity或单个Views 传递给AsyncTask的构造函数并将它们存储为成员变量,然后在 上更新它们onPostExecute()

请务必存储ContextActivity作为WeakReference以防止内存泄漏。

于 2013-10-23T18:11:33.857 回答
1

如果您要将 AsyncTask 放在单独的文件中,您可能会AsyncTask从其他活动中重用它,所以我认为最佳做法是对活动进行回调,以便它完成所有 UI 处理。

为此,您应该做的是创建一个如下所示的接口:

public interface OnGetAddCompletedListener {
    public void onGetAddCompleted(String text);
}

在你的构造函数中接收回调AsyncTask并调用其中的方法onPostExecute

public class GetAdd extends AsyncTask<Void, Void, JSONObject> {

    private OnGetAddCompletedListener callback;

    public GetAdd(OnGetAddCompletedListener callback) {
        this.callback = callback;
    }

    @Override
    protected JSONObject doInBackground(Integer... params) {
        // TODO Auto-generated method stub
        UserFunctions u = new UserFunctions();
        return u.getNewAdd();
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);
        callback.onGetAddCompleted(result.getString("Something");
    }
}

然后,在Activity您执行它时实现接口,以便在您获取数据时处理 UI 修改AsycTask

public class SampleActivity extends Activity implements OnGetAddCompletedListener {
    TextView textSample;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.aadd_addtocheck);
        textSample = (TextView) findViewById(R.id.lin);
                STask sampleTask = new Stask();
                sampleTask.execute();
    }

    public void onGetAddCompleted(String text) {
        textSample.setText(text);
    }
}

使用这种方法,如果您决定从其他活动中重用该 AsyncTask,您将能够在AsyncTask结束时执行不同的操作,以防您想这样做。

于 2013-10-23T19:11:08.707 回答
0

您可以在调用时将参数传递给 AsyncTask 的构造函数。假设在您的主要活动中,您有以下内容:

TextView tv = (TextView) findViewById(R.id.my_text_view);
Stask sampleTask = new Stask(tv);
sampleTask.execute();

创建 AsyncTask 时,您有:

class Stask extends AsyncTask ...(){
    final TextView textView; 

    public Stask(Textview inputFromOtherClass){
        this.textView = inputFromOtherClass;
    }
}

这样,在主活动中创建的 TextView 可以作为 AsyncTask 中的实例存在。

编辑:正如其他人发布的那样,您可以为 Context 做类似的事情,这对于创建各种实例很有用。

于 2013-10-23T18:30:08.443 回答