在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修改工作。谢谢。请考虑一下我的回答:“对不起,之前没有回复,我很忙。当然,我只需要更多的积分来支持投票,现在我不可能是一个新的配置文件。”