2012-04-29 6 views
0

私はプログラミングが初めてです。これは数日間苦労しており、うまく動作しません。遅れて写真を更新

私はいくつかのタスクを実行するためのループを持っています。特定のタスクについては、ImageViewの画像が表示されます。 1秒

  • のためにいくつかのタスク
  • 待機を行い、その後のコマンドが
  • たときにすべてのコマンドの終了を終了するまで、でそのアクティビティを閉じ、再びすべてを開始

    • setImageResource
    • :だから、このような何かを行きます

    私は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; 
        } 
    
    } 
    

    メインスレッドに遅延を待たせるために、変数「スリープ」を使用しています。

  • +1

    関連するコードとログキャッチエラーを投稿してください。 – Sam

    答えて

    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){}; 
    
    +0

    はい、ループはUIスレッドにあります。私はそれが良くないと理解しています。しかし、私はそれをしてアクションを読み、そのアクションイメージを500ms表示し、そのアクションを実行してから、次のアクションのループに戻って行きたいと思っています。それは「眠っている(眠っている){」; 〜のためです。ループ内にアクションがない場合は、そのアクティビティを終了します。だからこそ、私はonPostExecuteの新しいイメージを更新したくないのです。なぜなら、それは私をループから救うためです。 –

    +0

    あなたはUIスレッドでこれを実行してはいけません。それにより、Androidはアプリケーションを強制的に終了させる可能性があります。ループ全体をasynctaskに移動する必要があります。 asynctaskがインラインである限り、すべてが完了したらアクティビティを終了させることができます。 – MikeIsrael

    +0

    ありがとうマイク!私はループをdoInBackgroundに配置し、progressUpdateを使用してUIを更新します。今はうまくいきます。 –