我有一个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。
有没有人能解决这个问题?
答案 0 :(得分:4)
TextView
是params
中的第一个元素:
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]
作为参数即可。您可以在参数列表中的任何位置传递单个值,序列或数组...
。 (单个值实际上是一个只包含一个元素的序列。)