通常我会在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)。
答案 0 :(得分:2)
您将Context
,Activity
或单个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做类似的事情,这在创建各种实例时非常有用。