Asynctask 内部类不更新 UI 文本视图

Posted

技术标签:

【中文标题】Asynctask 内部类不更新 UI 文本视图【英文标题】:Asynctask inner class not updating UI textview 【发布时间】:2015-06-22 15:11:00 【问题描述】:

我有以下代码应该更新 Asynctask 上的 UI 文本视图:

public class HelloWorldActivity extends Activity

    private static TextView txtview;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtview = (TextView) findViewById(R.id.mainview);
    

    private static class SimpleTask extends AsyncTask<Void, Void, Void> 

        @Override
        protected Void doInBackground(Void... res) 
            try 
                Thread.sleep(1500);
             catch(InterruptedException exception) 
                Thread.currentThread().interrupt();
            
            return null;
        

        @Override
        protected void onPostExecute(Void params) 
            txtview.setText("Hola Mundo");
        

    

特别是我正在尝试在 1.5 秒后将 Hello World 更改为 Hola Mundo。问题是,在运行应用程序时,文本仍然是 Hello World 并且不会改变。我没有任何错误。我什至在onCreate 方法之外设置了txtview 值以避免任何访问问题(或者我认为)。

如果在txtview = (TextView) findViewById(R.id.mainview); 之后我执行txtview.setText("Hola Mundo");,那么它可以完美运行。

可能是什么问题?

【问题讨论】:

你在哪里调用 AsyncTask ? 写新的 SimpleTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);下面一行.. txtview = (TextView) findViewById(R.id.mainview);下面 【参考方案1】:

忘记通过调用AsyncTask.execute() 方法来执行AsyncTask。在初始化txtview TextView 对象后,在onCreate 方法中添加以下行:

SimpleTask objSimpleTask=new SimpleTask();
objSimpleTask.execute();

【讨论】:

起初我把它放在主课上,它抛出了一个&lt;identifier&gt; expected 错误,但你的深入回答消除了我的疑虑。它有效,谢谢!我迟早会支持你:)【参考方案2】:

你还没有调用ASyncTask,初始化TextView后这样执行:

txtview = (TextView) findViewById(R.id.mainview);
SimpleTask objSimpleTask=new SimpleTask();
objSimpleTask.execute();

希望就是你想要的。

【讨论】:

它会引发cannot find symbol 错误,但SimpleTask objSimpleTask = new SimpleTask(); objSimpleTask.execute(); 仍然有效。理解调用仍然是一个很好的答案应该放在onCreate 方法中。 谢谢,我已经编辑了答案,希望对其他人有所帮助。【参考方案3】:

目前您忘记调用 AsyncTask

但我认为使用 AsyncTask & Thread.sleep() 来更新 UI 是一种不好的做法

你可以简单地用Handler来做

Runnable updateUI;
Handler h = new Handler();

                    updateUI=new Runnable() 

                        @Override
                        public void run() 

                        txtview.setText("Hola Mundo");

                        
                    ;

                    h.postDelayed(updateUI,1500);

【讨论】:

你能解释一下为什么使用 AsyncTask 和 Thread.sleep() 来更新 UI 是不好的做法吗?你有什么我能读到的文章来解释它吗?谢谢。 ***.com/questions/3956512/… blogs.msmvps.com/peterritchie/2007/04/26/… 有趣。我现在将使用 Runnables,您的链接帮助我进一步研究该主题。如果您不介意,还有一个问题.. 我应该将Runnable 放在onCreate 中,它会创建一个不会干扰UI 线程的线程吗?我将h.postDelayed(updateUI,1500); 放在onCreate 中,其他所有内容都放在主类HelloWorldActivity 中,但它给出了错误&lt;identifier&gt; expected [javac] updateUI=new Runnable() 我必须添加 import android.os.Handler 并将所有内容放入 onCreate 现在可以正常工作。

以上是关于Asynctask 内部类不更新 UI 文本视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android AsyncTask 更改活动 UI?

如何在Android开发中用AsyncTask异步更新UI界面

从 Asynctask 更新 MainActivity 上的 ListView

在 Swift 中,如何从异步任务外壳内部更新主线程上的文本视图

Android:尽管使用了 AsyncTask,但主线程被阻止

如何在viewmodel中的异步任务后更新UI