首页 文章

带有textview参数的AsyncTask

提问于
浏览
1

我有一个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 回答

  • 2

    您的 TextViewparams 中的第一个元素:

    TextView tv = params[0];
    

    NOTE:

    如果您打算在 doInbackground() don't 中修改 TextView ,请执行此操作,因为您要从另一个线程修改视图,而是使用 onPostExecute 方法) .

  • 4

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

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

    试试 Arrays.asList(tv);

    如果要传递单个TextView,则需要在MyClass中定义Construcotr,然后将TextView存储为MyClass中的字段 . Beware 尽管如此,您不应该在任务中持有对视图或上下文的引用 . 这将阻止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);
        }
    }
    
  • 3

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

相关问题