我想在AsyncTask的onPostExecute中生成一个TextView,如下所示:
protected class AsyncTranslator extends AsyncTask<String, JSONObject, String>
{
@Override
protected String doInBackground(String... params) {
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String mymeaning) {
TextView myView = new TextView(this);
myView.setText(Html.fromHtml(myString));
}
}
但它给出了错误,告诉我这不能应用于AsyncTranslator。 你能告诉我如何在AsyncTask onPostExecute中生成textViews吗?感谢。
答案 0 :(得分:3)
来自documentation可能的构造函数
TextView(Context context)
TextView(Context context, AttributeSet attrs)
TextView(Context context, AttributeSet attrs, int defStyleAttr)
TextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
但你正在做
TextView myView = new TextView(this);
在AsyncTranslator
内,这是不正确的。
如果您引用了上下文,则可以在TextView
内轻松创建AsyncTask
。请参阅此thread以获取对您的上下文的引用。
修改强> 您似乎已经有了对上下文的引用,所以只需执行
TextView myView = new TextView(context);
答案 1 :(得分:1)
在AsyncTask中,你不应该在基本UI线程上进行操作,在这里你要尝试这样做。尝试创建新的接口,让您传递结果。
public interface asyncTaskInterface {
public void printEditText();
}
然后在你的AsyncTask中:
protected class AsyncTranslator extends AsyncTask<String, JSONObject, String>
{
public asyncTaskInterface delegate;
@Override
protected String doInBackground(String... params) {
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(context, "Please wait.", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPostExecute(String mymeaning) {
delegate.printEditText();
}
}
在结果类中,您必须实现接口并将该类作为委托传递给异步任务:
public class myClassActivity implements asyncTaskInterface ...
在调用异步任务之前指定委托:
AsyncTranslator translator = new AsyncTranslator();
translator.delegate = this;
translator.execute();
在您的活动结束时,从您的inface覆盖该方法并在其中构建TextView。
答案 2 :(得分:0)
首先创建一个这样的界面:
public interface onTextViewCreatedListener {
public void onTextViewCreated(TextView tv);
}
然后像这样更改你的AsyncTranslator类
protected class AsyncTranslator extends AsyncTask<String, JSONObject, String>
{
private onTextViewCreatedListener onTextViewCreatedListener;
public AsyncTranslator(onTextViewCreatedListener onTextViewCreatedListener){
this.onTextViewCreatedListener = onTextViewCreatedListener;
}
@Override
protected String doInBackground(String... params) {
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(context, "Please wait.", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPostExecute(String mymeaning) {
//since you have passed context to Toast in onPreExecute use that context here also.
TextView myView = new TextView(context);
myView.setText(Html.fromHtml(myString));
if(onTextViewCreatedListener!=null){
onTextViewCreatedListener.onTextViewCreated(myView);
}
}
}
然后在您的活动类中使用AsyncTranslator类,如下所示:
AsyncTranslator asyncTranslator = new AsyncTranslator(new onTextViewCreatedListener() {
@Override
public void onTextViewCreated(TextView tv) {
//you can use your created textview here
}
});
该上下文应该从您要调用aynctask.execute()
的活动传递