0

私が作成している UI にはボタンが含まれており、これは一度押されると、ユーザーがボタンを再度押すまで繰り返し値を見つけて表示することになっています。

これは、リスナーを使用したボタンの初期化です。

pollOn = false;
pollButton = (Button) findViewById( R.id.pollButton );
    pollButton.setOnClickListener( new OnClickListener() {
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.i( "POLL BUTTON", "onClick" );
            if( !pollOn ) {
                Log.i( "POLL BUTTON", "!pollOn" );
                pollOn = true;
                methodToReadAndDisplayData();
            } else {
                Log.i( "POLL BUTTON", "else pollOn" );
                pollOn = false;
            }
        }
    });

読みやすくするためにここには示していませんが、私が現在動作させている方法はmethodToReadAndDisplayData()、for ループで 5 回呼び出してから停止することです。

pollButtonそのため、最初に を押すと、UI がフリーズLog.i("POLL BUTTON", "onClick")して の上部に表示されますLogCat。次に、フリーズしているように見える間に を押しpollButtonます。すべての作業が完了し、UI がフリーズしなくなると、 のLog.i("POLL BUTTON", "onClick")最後に が表示されLogCatます。私がこれを解釈している方法は、ボタンのクリックがキューに入力されonClick、for ループの 5 回の反復がすべて完了した後にメソッドが呼び出されるということです。

この問題のもう 1 つの大きな部分は、行われている作業が主にネイティブ ライブラリで行われており、NDK を使用して呼び出されていることです。これが UI のフリーズと関係があるかどうかはわかりませんが、必要な処理時間が増加することは間違いありません。

不明な点やわかりにくい点がありましたらお知らせください。明確にするよう努めます。

この状況に関する情報をいただければ幸いです。

4

3 に答える 3

1

システムUIがフリーズするメインスレッドで実行しているため、UIを通常どおり実行したままにする新しいスレッドで実行する方がよいでしょう。以下は、新しいスレッドでメソッドを実行する方法の例です。

new Thread(new Runnable() {
    @Override
    public void run() {
        methodToReadAndDisplayData();
    }
}).start();

メソッドが何らかの方法で UI とやり取りする場合は、次の方法で行う必要があることに注意してください。

UI を更新する場合:

Handler threadHandler = new Handler();
threadHandler.post(updateRunnable);

ここで UI を更新します。

Runnable updateRunnable = new Runnable() {
    public void run() {
        example.setText(newValue);
    }
};

それを試してみて、改善があるかどうかを確認してください。私はNDKを使ったことがなく、標準のSDKだけを使ったので、私が気付いていない違いがあるかもしれません.

于 2013-07-29T20:36:39.127 に答える
0

別のスレッドで実行してください。AsyncTask を使用してmethodToReadAndDisplayDataを呼び出します。

于 2013-07-29T20:36:46.257 に答える