0

私は、ListActivityを使ってインターネットからダウンロードした画像だけでなく、TextViewや評価バーを表示するアプリケーションを作っています。 これを管理するAsyncTaskを追加しました。私のsetListAdapterをonPostExecute()の部分に追加しました。しかし、設定が完了している間にプログレスバー(またはプログレス・ダイアグラム)を表示したかったのです。ListActivityブロックapp内のアイテムの読み込み

バーは私のエミュレータではしばらく表示されますが、デバイス上で私のアプリを試しても、エミュレータ内でさえも、setListAdapterが動作しているときにバーがフリーズします...ただ、私のArrayAdapterにpublishProgressを追加する方法は、もう一つのクラスだから分かりません。 ああ、私はListActivityのレイアウトを設定しました。それはprogressBarを配置する場所ですが、私が推測するデバイスはdoInBackgroundを非常に高速にしてレイアウトが表示されないようにします。

@Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

      extras = getIntent().getExtras(); 
      platinumCinema = false; 
      setContentView(R.layout.simple_list_item_1); 

       Log.i(TAG,"Control B"); 
       MoviesAsyncTask movieTask = new MoviesAsyncTask(); 
       movieTask.execute(); 
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title_billboard); 
    } 

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mProgress = (ProgressBar)findViewById(R.id.progressbar_Horizontal);   
     mProgress.setVisibility(View.VISIBLE); 
     Log.i(TAG, "PreExecute"); 
     } 

    @Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 
       if(result.equals("ok")) 
        Log.i(TAG,"Ended succesfully"); 
       //ProgressDialog mDialog = ProgressDialog.show(BillboardMovieList.this, "","Loading. Please wait...", true); 

       publishProgress(75); 

      if(searchMethod.equals("byCinema")){ 
       setListAdapter(new ArrayAdapterSchemaCinemas(BillboardMovieList.this, listMovies,listPosters, listRating, listTimes)); 
      }else 
... 

答えて

0

onPostExecute()からpublishProgress()を呼び出さないでください:

これは私がこれまで持っているものです。初心者の方は、onPostExecute()ロジックを実行中のメインアプリケーションスレッドでonProgressUpdate()を呼び出す必要があるため、onPostExecute()が完了するまで進捗は変わりません。

動作が遅すぎると感じたら、Traceviewまたは単純なロギングステートメントを使用して、問題の場所を正確に特定することをお勧めします。

+0

これまで問題が発生していたのは、listAdapterを設定するときです。これは、リスト自体を生成するためにUIスレッドをブロックする(間違っていなければ)タスクです。これはonPostExecuteで行う必要があります。なぜならdoInBackgroundはこれを処理できないのですか? –

+0

@Paulina D: 'doInBackground()'でアダプタを作成できますが、 'setListAdapter()'を 'onPostExecute()'まで呼び出すことはできません。 – CommonsWare

+0

どうすればアダプタを作成できますか?リストビューのドキュメントでは、onCreateAdapterなどは表示されません。=( –

関連する問題