Android 如何在asynctask中处理UI?
通常我会在postExecute方法中更新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=
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中实现的方法