Android 如何在asynctask中处理UI?

Android 如何在asynctask中处理UI?,android,android-asynctask,Android,Android Asynctask,通常我会在postExecute方法中更新UI。 e、 g public类SampleActivity扩展活动{ 文本视图文本样本; @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.aadd_addtocheck); textSample=(TextView)findViewById(R.id.lin); STask sampleTask=

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

public类SampleActivity扩展活动{
文本视图文本样本;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.aadd_addtocheck);
textSample=(TextView)findViewById(R.id.lin);
STask sampleTask=新STask();
sampleTask.execute();
}
类GetAdd扩展了异步任务{
@凌驾
受保护的JSONObject doInBackground(整数…参数){
//TODO自动生成的方法存根
UserFunctions u=新的UserFunctions();
返回u.getNewAdd();
}
@凌驾
受保护的void onPostExecute(JSONObject结果){
super.onPostExecute(结果);
setText(result.getString(“某物”);
}

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

您将
上下文
活动
,或单个
视图
传递到
asynctask
的构造函数,并将它们存储为成员变量,然后在
onPostExecute()上更新它们。


确保将
上下文
活动
存储为防止内存泄漏。

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

TextView tv = (TextView) findViewById(R.id.my_text_view);
Stask sampleTask = new Stask(tv);
sampleTask.execute();
创建异步任务时,您有:

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

    public Stask(Textview inputFromOtherClass){
        this.textView = inputFromOtherClass;
    }
}
这样,在主活动中创建的TextView可以作为AsyncTask中的实例存在


编辑:正如其他人所发布的,您可以对上下文执行类似的操作,这在创建各种实例时非常有用。

如果要将AsyncTask放在一个单独的文件中,您可能会从其他活动中重用该
AsyncTask
,因此我认为最好的做法是这样对活动进行回调它完成所有UI处理

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

TextView tv = (TextView) findViewById(R.id.my_text_view);
Stask sampleTask = new Stask(tv);
sampleTask.execute();
公共接口OnGetAddCompletedListener{ 公共void onGetAddCompleted(字符串文本); } 在
AsyncTask
的构造函数中接收回调,并在
onPostExecute

public类GetAdd扩展异步任务{
私有OnGetAddCompletedListener回调;
公共GetAdd(OnGetAddCompletedListener回调){
this.callback=回调;
}
@凌驾
受保护的JSONObject doInBackground(整数…参数){
//TODO自动生成的方法存根
UserFunctions u=新的UserFunctions();
返回u.getNewAdd();
}
@凌驾
受保护的void onPostExecute(JSONObject结果){
super.onPostExecute(结果);
onGetAddCompleted(result.getString(“某物”);
}
}
然后,在您正在执行的
活动
中实现该接口,以便当您在
AsycTask
中获取数据时,它处理UI修改:

公共类SampleActivity扩展活动实现OnGetAddCompletedListener{
文本视图文本样本;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.aadd_addtocheck);
textSample=(TextView)findViewById(R.id.lin);
STask sampleTask=新STask();
sampleTask.execute();
}
公共void onGetAddCompleted(字符串文本){
textSample.setText(text);
}
}

通过这种方法,如果您决定重用其他活动中的异步任务,那么当
AsyncTask
结束时,您将能够做不同的事情,如果您想这样做。

关于使用
接口
AsyncTask
我对一件事感到有点困惑-如果我有两个正在运行的活动实现了OnGetAddCompletedListener;其中一个启动asyncTask。当异步任务完成时,两个活动或仅启动asyncTask的活动将接收回调?使用这种方法,您要做的是对调用活动进行引用(或者无论您在何处从so执行
AsyncTask
,当
onPostExecute
将调用在您调用它的活动中实现的方法
onGetAddCompleted
。因此,如果您的ActivityA和ActivityB都实现了
OnGetAddCompletedListener
,那么当您执行
AsyncTask
在ActivityA中,
onPostExecute
将调用在ActivityA中实现的方法,当您从ActivityB执行它时,
onPostExecute
将调用在ActivityB中实现的方法