【问题标题】:Asynctask inner class not updating UI textviewAsynctask 内部类不更新 UI 文本视图
【发布时间】: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);下面

标签: android android-layout android-fragments android-asynctask


【解决方案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 是不好的做法吗?你有什么我能读到的文章来解释它吗?谢谢。
  • 有趣。我现在将使用 Runnables,您的链接帮助我进一步研究该主题。如果您不介意,还有一个问题.. 我应该将Runnable 放在onCreate 中,它会创建一个不会干扰UI 线程的线程吗?我将h.postDelayed(updateUI,1500); 放在onCreate 中,其他所有内容都放在主类HelloWorldActivity 中,但它给出了错误&lt;identifier&gt; expected [javac] updateUI=new Runnable() {
  • 我必须添加 import android.os.Handler 并将所有内容放入 onCreate 现在可以正常工作。
猜你喜欢
  • 2019-05-23
  • 2021-04-04
  • 2015-03-30
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多