如何在AsyncTask中生成TextView - PostExecute

时间:2015-11-10 08:25:55

标签: java android android-asynctask

我想在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吗?感谢。

3 个答案:

答案 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()

的活动传递