在AsyncTask中获取TextView - Android
问题描述:
我想在textView中发布我的AsyncTask(一个字符串)的结果。在AsyncTask中获取TextView - Android
这里是我公司主营:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ReadRss readRss=new ReadRss(this);
readRss.execute();
......
}
这里是我的AsyncTask:
public class ReadRss extends AsyncTask<Void,Void,Void> {
public ReadRss(Context context){
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Void aVoid) {
}
@Override
protected Void doInBackground(Void... params) {
ProcessXml();
return null;
}
private void ProcessXml() {
//HERE CREATE MY STRING
String myresult="example";
TextView txt_ris = (TextView)findViewById(R.id.txt_ris); <---HOW CAN I DO THIS?
txt_ris.setText(myresult);
}
}
}
}
FindViewById不要在工作的AsyncTask这样?我怎样才能TextView的在这里? 也许我可以在AsyncTask中将它作为paramiter传递,语法是什么?
答
您需要将UI工作onPostExecute
方法,因为doInBackground执行不UI线程
public class ReadRss extends AsyncTask<Void,Void,String> {
public ReadRss(Context context){
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(String string) {
TextView txt_ris = (TextView)findViewById(R.id.txt_ris);
txt_ris.setText(myresult);
}
@Override
protected String doInBackground(Void... params) {
return ProcessXml();
}
private String ProcessXml() {
//HERE CREATE MY STRING
return "example";
}
}
答
为了您的TextView被正确引用,你需要一个框架,并且你已经在你的起始活动参考您的AsyncTask的构造函数,所以你可以这样做:
public class ReadRss extends AsyncTask<Void,Void,Void> {
private TextView tv;
private YourStartingActivity activity;
public ReadRss(Context context){
activity = (YourStartingActivity)context;
tv = (TextView)activity.findViewById(R.id.txt_ris)
}
@Override
protected void onPreExecute() {
...
}
@Override
protected void onPostExecute(Void aVoid) {
(follow Michael Spitsin instructions here)
}
@Override
protected Void doInBackground(Void... params) {
...
}
}
移动代码编辑postExecute – W0rmH0le
内的文本视图不能更改从后台线程的UI无论如何,即使你传递的TextView作为扩声rameter。您可以使用[EventBus](https://github.com/greenrobot/EventBus)在获取数据时发布事件,在您的活动中监听该事件,并在该事件中更改文本。 – Vucko
我不能将字符串返回到主?你可以做一个EventBus的例子吗?在主线程上调用onPreExecute()和onPostExecute()方法调用 – GMX