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();
【讨论】:
起初我把它放在主课上,它抛出了一个<identifier> 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
中,但它给出了错误<identifier> expected [javac] updateUI=new Runnable()
我必须添加 import android.os.Handler
并将所有内容放入 onCreate
现在可以正常工作。以上是关于Asynctask 内部类不更新 UI 文本视图的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Android AsyncTask 更改活动 UI?
如何在Android开发中用AsyncTask异步更新UI界面
从 Asynctask 更新 MainActivity 上的 ListView
在 Swift 中,如何从异步任务外壳内部更新主线程上的文本视图