0

我有一些看起来像这样的代码:

loading = (TextView) findViewById(R.id.loading);

public void enterButton(View v) { // This is a button
    loading.setVisibility(TextView.VISIBLE); // For some reason this does not happen...
    MyApp.initialize(); // ... before this is completed
    Intent i = new Intent(this, AnotherActivity.class);
    startActivityForResult(i, 0);
}

loading 是一个 TextView,它简单地说,“正在加载……”。MyApp.initialize() 是一个计算量很大的方法,它设置了 AnotherActivity。运行需要几秒钟,这就是为什么我希望出现“正在加载...”消息。

问题是大部分时间 loading.setVisibility(TextView.VISIBLE) 似乎没有做任何事情。我从来没有看到过文字。在极少数情况下,我会在 Activity 更改之前看到“正在加载...”短暂闪烁。有些东西告诉我,Android 正在将 loading.setVisibility(TextView.VISIBLE) 放在堆栈或其他东西上,然后直到 MyApp.initialize() 完成后才开始这样做,这显然为时已晚。我希望在 MyApp.initialize() 开始之前出现“正在加载...”。

活动更改前的动画看起来很接近,但 .setAnimationListener 不适用于 TextView。TextView 有类似的东西吗?我对此进行了尝试,但应用程序挂起:

loading.setVisibility(TextView.VISIBLE); 
loading.setOnEditorActionListener(new TextView.OnEditorActionListener() {               
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        MyApp.initialize();
        Intent i = new Intent(MyApp.getInstance(), AnotherActivity.class);
        startActivityForResult(i, 0);
        return true;
    }
});

有什么建议么?谢谢你。

4

4 回答 4

1

我不确定(因为看你的代码并不明显),但似乎你在一个线程中做所有事情。更改可见性调用 invalidate 方法,这将导致视图在 NEXT DRAW CALL 中重绘。TextView 将仅在下一次绘制调用后可见,这可能由于活动更改而不会发生。

您应该像往常一样设置可见性并使用初始化和意图调用启动一个新线程。也许您还应该手动调用 invalidate 。这会成功的。您的应用程序将在后台初始化,并且绘图线程将显示 TextView。

于 2013-07-04T08:11:25.507 回答
1

我建议您尝试使用 Async 任务来显示文本并执行您MyApp.initialize()的操作doInBackground并调用意图onPostExecute,这类似于

private ProcessDataAsync processDataAsync;

    public class ProcessDataAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            MyApp.initialize();

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            Intent i = new Intent(context, AnotherActivity.class);
            startActivityForResult(i, 0);

        }

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

            loading.setVisibility(View.VISIBLE);

        }
    }

然后在 onClickListener 中调用 asynctask 作为

    processDataAsync = new ProcessDataAsync();
    processDataAsync.execute((Void[]) null);

希望这可以帮助。

于 2013-07-04T09:47:11.800 回答
1

您应该使用线程或 asynctask 进行初始化工作。

loading = (TextView) findViewById(R.id.loading);
Handler h = new Handler();
public void enterButton(View v) { // This is a button
    loading.setVisibility(TextView.VISIBLE);

    new Thread(new Runnable() {
        @Override
        public void run() {
            MyApp.initialize();
            h.post(new Runnable() {
                @Override
                public void run() {
                    Intent i = new Intent(this, AnotherActivity.class);
                    startActivityForResult(i, 0);
                }
            });
        }
    }).start();
}
于 2013-07-04T08:35:04.607 回答
0

尝试这个

loading.setVisibility(View.VISIBLE);

于 2013-07-04T08:07:59.600 回答