在AsyncTask中获取文本视图-Android
我想在文本视图中发布异步任务的结果(字符串) 以下是我的主要观点:在AsyncTask中获取文本视图-Android,android,android-asynctask,Android,Android Asynctask,我想在文本视图中发布异步任务的结果(字符串) 以下是我的主要观点: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ReadRss readRss=new ReadRss(this); readRss.execute(); ...... } 以下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ReadRss readRss=new ReadRss(this);
readRss.execute();
......
}
以下是我的任务:
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);
}
}
}
}
公共类ReadRss扩展异步任务{
公共阅读器(上下文){
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onPostExecute(void避免){
}
@凌驾
受保护的Void doInBackground(Void…参数){
ProcessXml();
返回null;
}
私有void ProcessXml(){
//这里创建我的字符串
字符串myresult=“example”;
TextView txt_ris=(TextView)findViewById(R.id.txt_ris);您需要将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";
}
}
公共类ReadRss扩展异步任务{
公共阅读器(上下文){
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onPostExecute(字符串){
TextView txt_-ris=(TextView)findViewById(R.id.txt_-ris);
txt_ris.setText(myresult);
}
@凌驾
受保护字符串doInBackground(无效…参数){
返回ProcessXml();
}
私有字符串ProcessXml(){
//这里创建我的字符串
返回“示例”;
}
}
要正确引用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) {
...
}
}
公共类ReadRss扩展异步任务{
私家图文电视;
私人启动活动;
公共阅读器(上下文){
活动=(YourStartingActivity)上下文;
tv=(TextView)activity.findViewById(R.id.txt_ris)
}
@凌驾
受保护的void onPreExecute(){
...
}
@凌驾
受保护的void onPostExecute(void避免){
(请按照Michael Spitsin的说明进行操作)
}
@凌驾
受保护的Void doInBackground(Void…参数){
...
}
}
移动代码以编辑PostExecute中的文本视图您无论如何都不能从后台线程更改UI,即使您确实将TextView作为参数传递。您可以做的是在获取数据时使用发布事件,在活动中侦听该事件,并在该事件发生时更改文本。我无法返回字符串bac主线程上调用onPreExecute()和onPostExecute()。因此,您可以在onPostExecute()中设置文本,该文本在doInBackground()完成后调用。受保护字符串doInBackground(Void…params){return ProcessXml();}这里我得到一个错误:doInBackground(Void…)与doInBackground(Params)冲突…尝试使用不兼容的类型。不工作,因为我将字符串从ProcessXml()传递到onPostExecute时出错。使用return并尝试修改void方法时出错提供ProcessXml()的完整代码
和完整的stacktrace,谢谢。所以我添加了我的答案。这是我的拼写错误。现在我编写了私有字符串ProcessXml()
而不是私有void ProcessXml()
我只是在AsyncTask的顶部定义我的字符串,并在inPostExecute()中设置TextView的值;然后实现Chisko答案。使用这3个modify可以很好地工作。谢谢。您的答案似乎正确,但我现在不知道如何将字符串从ProcessXml()传递到onPostExecute。我在某些方法中使用return时出错(Michael Spitsin解决方案),您可以更正return和void方法来执行此操作吗?我只是在AsyncTask的顶部定义我的字符串,并在inPostExecute()中设置TextView的值然后再执行你的答案。用这个3修改工作。谢谢。请考虑一下我的回答:“对不起,之前没有回复,我很忙。当然,我只需要更多的积分来支持投票,现在我不可能是一个新的配置文件。”