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) が何もしていないように見えることです。私はテキストを見ることはありません。まれに、アクティビティが変更される直前に「読み込み中...」が一瞬点滅することがあります。Android が loading.setVisibility(TextView.VISIBLE) をスタックか何かに置いていて、MyApp.initialize() が完了するまでそれを実行しようとしていないことがわかりますが、これは明らかに遅すぎます。MyApp.initialize() が開始する前に「読み込み中...」が表示されるようにしたいと思います。

アニメーション BEFORE アクティビティの変更は近いように見えますが、.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

初期化作業にはスレッドまたは 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 に答える
1

MyApp.initialize()Async タスクを使用してテキストを表示し、 indoInBackgroundでインテントを呼び出してみることをお勧めします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

よくわかりませんが(コードを見ても明らかではないため)、すべてを1つのスレッドで実行しているようです。可視性を変更すると無効なメソッドが呼び出され、NEXT DRAW CALL でビューが再描画されます。TextView は、アクティビティの変更により発生しない可能性がある次の描画呼び出しの後にのみ表示されます。

通常どおり可視性を設定し、初期化とインテント コールで新しいスレッドを開始する必要があります。手動で無効化を呼び出す必要があるかもしれません。これでうまくいきます。アプリはバックグラウンドで初期化され、描画スレッドは TextView を表示します。

于 2013-07-04T08:11:25.507 に答える