如何在asynctask中处理UI?

时间:2013-10-23 18:03:29

标签: android android-asynctask

通常我会在postExecute方法中更新UI e.g。

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成为一个separete类时如何更新UI(比如设置texviews)。

3 个答案:

答案 0 :(得分:2)

您将ContextActivity或单个View传递给AsyncTask的构造函数并将其存储为成员变量,然后在{ {1}}。

请务必将onPostExecute()Context存储为WeakReference以防止内存泄漏。

答案 1 :(得分: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中实现接口,以便在获取AsycTask中的数据时处理UI修改:

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结束时您可以执行不同的操作,以防您想要这样做。

答案 2 :(得分: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做类似的事情,这在创建各种实例时非常有用。