带有textview参数的AsyncTask

时间:2012-03-27 13:49:13

标签: android android-asynctask

我有一个AsyncTask,在类中加载了textview,所以它看起来像这样:

private class MyClass extends AsyncTask<TextView, Void, Void>{
}
TextView tv;

以这种方式加载

"new MyClass(tv).execute();"

之所以这样,是因为我在viewflipper中加载了textview,并且在任务中有一个长加载方法来实现进程对话框。

我的错误发现在“protected Void doInBackground(TextView ... params){”这是params是TextView []但不是单个TextView。

有没有人能解决这个问题?

3 个答案:

答案 0 :(得分:4)

TextViewparams中的第一个元素:

TextView tv = params[0];

注意:

如果您打算修改TextView 中的doInbackground(),请执行此操作,因为您将抛出异常(您可以' t修改另一个线程的视图,而不是使用onPostExecute方法。

答案 1 :(得分:3)

您无法更改AsyncTask.doInBackground()方法的方法签名。

它定义为采用varargs参数,因此您必须将TextView []参数传递给AsyncTask。

尝试 Arrays.asList(tv);

如果要传递单个TextView,则需要在MyClass中定义Construcotr,然后将TextView存储为MyClass中的字段。 谨防尽管如此,您不应该在任务中保留对View或Contexts的引用。这将阻止Android操作系统垃圾收集拥有TextView的活动,并可能导致内存泄漏。如果必须在AsyncTask中保留对视图或上下文的引用,请使用以下内容:

private class MyClass extends AsyncTask<TextView, Void, Void>{ 

    private WeakReference<TextView> tvRef;

    public MyClass(TextView tv) {
        this.tvRef = new WeakReference<TextView>(tv);
    }
}

答案 2 :(得分:2)

只需阅读params[0]作为参数即可。您可以在参数列表中的任何位置传递单个值,序列或数组...。 (单个值实际上是一个只包含一个元素的序列。)