该示例非常简单:我想通过仅显示文本(canvas.drawText())来让用户知道应用程序在做什么。然后,出现我的第一条消息,而不是其他消息。我的意思是,我有一个“ setText”方法,但它不会更新。
onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(splash); // splash is the view class loadResources(); splash.setText("this"); boundWebService(); splash.setText("that"): etc(); splash.setText("so on"); }
该视图的文本绘制仅通过在onDraw();中执行一个drawText来起作用,因此setText更改了文本但不显示它。
有人建议我用SurfaceView替换视图,但是仅进行几次更新就会麻烦很多,所以……我该如何在运行时动态更新视图?
它应该非常简单,只显示一个文本2秒钟,然后主线程执行其工作,然后更新文本…
谢谢!
更新:
我尝试实现handler.onPost(),但又是同一回事了。让我为您提供代码:
public class ThreadViewTestActivity extends Activity { Thread t; Splash splash; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); splash = new Splash(this); t = new Thread(splash); t.start(); splash.setTextow("OA"); try { Thread.sleep(4000); } catch (InterruptedException e) { } splash.setTextow("LALA"); } }
和:
public class Splash implements Runnable { Activity activity; final Handler myHandler = new Handler(); public Splash(Activity activity) { this.activity=activity; } @Override public void run() { // TODO Auto-generated method stub } public synchronized void setTextow(final String textow) { // Wrap DownloadTask into another Runnable to track the statistics myHandler.post(new Runnable() { @Override public void run() { TextView t = (TextView)activity.findViewById(R.id.testo); t.setText(textow); t.invalidate(); } }); } }
尽管飞溅发生在其他线程中,但我在主线程上进行了睡眠,我使用处理程序来管理UI和所有内容,它不会更改任何内容,仅显示最近的更新。
我还没有实现这一目标,但是我认为通常的模式是在后台线程中进行长时间的初始化,并用于Handler.post()更新UI。请参阅http://developer.android.com/reference/android/widget/ProgressBar.html,以获取其他示例,但可能与之相关。
Handler.post()
另请参见以下答案,尤其是第一段:
问题很可能是您在完成所有工作的同一个线程中运行启动屏幕(某种对话框,例如我假设的ProgressDialog)。这将使初始屏幕的视图不会被更新,甚至可以使其不显示在屏幕上。您需要显示初始屏幕,启动AsyncTask实例以下载所有数据,然后在任务完成后隐藏初始屏幕。
更新 (基于您的更新和评论):除了在其中创建活动的线程之外,不应在任何线程中更新UI。为什么您不可能在后台线程中加载资源?