0

私はプログラミングに不慣れで、これに何日も苦労していて、それを機能させることができません。

いくつかのタスクを実行するためのループがあります。ImageViewその特定のタスクの画像が表示されます。したがって、次のようになります。

  • setImageResource
  • いくつかのタスクを実行します
  • 1秒待ちます
  • 次に、コマンドが終了するまですべてを再開します
  • すべてのコマンドが終了したら、finish()を呼び出してそのアクティビティを閉じます

runnableとasynctaskでハンドラーを使用しようとしましたが、動作させることができません。UIは、常に1秒の遅延より後に更新されます。コマンドの終了後にfinish()を呼び出すと、写真がまったく表示されないようです。

for(int i=0; i<actions.size(); i++) {
            switch((int)actions.get(i)[0]) {
            case 0:
                ivActionIcon.setImageResource(R.drawable.image);
                sleeping=true;
                DelayAsyncTask delay=new DelayAsyncTask();
                delay.execute();
                while(sleeping){};
                break;
            }
        }
        finish();
class DelayAsyncTask extends AsyncTask<String, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(String... params) {
        try {
            Thread.sleep(5000);
        } catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    @Override 
    protected void onPostExecute(Bitmap bitmap) {
        sleeping=false;
    }

}

変数「sleeping」を使用して、メインスレッドに遅延を待機させています。

4

1 に答える 1

0

推測すると、このループはUIスレッドのどこかにあります。これは、非同期が終了するまでUIスレッドをブロックしていることを意味します。それはNO-NOです!onPostExecuteで画像を更新してみませんか?何かのようなもの

class DelayAsyncTask extends AsyncTask<String, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(String... params) {
        try {
            Thread.sleep(5000);
        } catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
    @Override 
    protected void onPostExecute(Bitmap bitmap) {
        ivActionIcon.setImageResource(R.drawable.new_image);
    }

明らかにこのコード行も削除してください(とにかくそのようなことをする理由がわからないと思います)。

while(sleeping){};
于 2012-04-30T13:51:04.830 に答える