2016-07-22 99 views
1

我想在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传递,语法是什么?

+0

移动代码编辑postExecute – W0rmH0le

+1

内的文本视图不能更改从后台线程的UI无论如何,即使你传递的TextView作为扩声rameter。您可以使用[EventBus](https://github.com/greenrobot/EventBus)在获取数据时发布事件,在您的活动中监听该事件,并在该事件中更改文本。 – Vucko

+0

我不能将字符串返回到主?你可以做一个EventBus的例子吗?在主线程上调用onPreExecute()和onPostExecute()方法调用 – GMX

回答

2

您需要将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"; 
    } 
} 
+0

protected String doInBackground(Void ... params){ return ProcessXml(); }这里我得到一个错误:doInBackground(Void ...)与doInBackground(Params)发生冲突...尝试使用不兼容的类型。 – GMX

+0

因为我将字符串从ProcessXml()传递给onPostExecute,所以不要使用错误。我得到错误使用返回并试图修改无效方法 – GMX

+0

提供'processXml()'和完整的堆栈跟踪的完整代码,请 –

1

为了您的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) { 
     ... 
    } 
} 
+0

您的回答看起来不错,但我现在不知道如何将字符串从ProcessXml()传递给onPostExecute。我在某些方法(迈克尔Spitsin解决方案)中使用返回时出现错误,请问您是否可以更正返回和无效方法来执行此操作? – GMX

+0

我只是在AsyncTask的顶部定义了我的字符串,并在inPostExecute()中设置了TextView的值;然后再实现你的答案。这3个修改工作正常。非常感谢 – GMX

+0

请考虑upvoting我的答案:)抱歉,以前没有回复,我很忙。 – Chisko