小编典典

在Android运行时更新视图

java

该示例非常简单:我想通过仅显示文本(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和所有内容,它不会更改任何内容,仅显示最近的更新。


阅读 225

收藏
2020-11-19

共1个答案

小编典典

我还没有实现这一目标,但是我认为通常的模式是在后台线程中进行长时间的初始化,并用于Handler.post()更新UI。请参阅http://developer.android.com/reference/android/widget/ProgressBar.html,以获取其他示例,但可能与之相关。

另请参见以下答案,尤其是第一段:

问题很可能是您在完成所有工作的同一个线程中运行启动屏幕(某种对话框,例如我假设的ProgressDialog)。这将使初始屏幕的视图不会被更新,甚至可以使其不显示在屏幕上。您需要显示初始屏幕,启动AsyncTask实例以下载所有数据,然后在任务完成后隐藏初始屏幕。

更新 (基于您的更新和评论):除了在其中创建活动的线程之外,不应在任何线程中更新UI。为什么您不可能在后台线程中加载资源?

2020-11-19