2012-05-02 9 views
0

私はいくつかのリストビューにダウンロードキックオフボタンがあるファイルのダウンロードのようないくつかの機能を実装しようとしています。それをもっと明確にするために、グラフで説明してください。アンドロイドでアクティビティを再エンロールした後、asynctaskでプログレスバーを更新するには

まず、私はそこにいくつかのリストビューでBook1_Activityを入力してください:[book_chapter_name_1 [download_1]] [book_chapter_name_2 [download_2]] 私はボタンをdownload_1クリックし、 ダウンロードがキックオフされると示してプログレスバーがあります進捗度。ダウンロードはAsyncTaskによって行われます。

その後、私はbook_read_activityと言って、読書を続けながらいくつかの本をダウンロードできるようにしたいと考えています。

Book1_Activityが破棄されて再作成されたため、ダウンロードした書籍の進捗状況を確認したいときにBook1_Activityに戻ってきたので、ダウンロードを進めて更新するにはどうすればいいですか?

+1

AsyncTaskコードをアップロードできますか???? もっと理解できる... – Wolverine

答えて

0

代わりにサービスを使用していると考えられますか?その後、閉じていても実行できるのですか? あなたのアプローチで進めたいのであれば、asynctaskにグローバルアクセスポイントへの進捗状況を書き込ませ、そこから進捗状況を読むことができます。

+0

サービスはバックグラウンド作業で大丈夫かもしれません。しかし、この状況のた​​めにサービスを更新する方法はないようです。グローバルなアクセスポイントは今私がやろうとしているものです。しかし、それはコードの周りに混乱します。そこには解決策があります。 – David

+0

@ david.wanカスタムブロードキャストと一緒にサービスが妥当な可能性があります。 – Warpzit

+0

グローバルアクセスポイントはどのような方法でも動作します。 – David

0

これは私が常に使用しているものです。

ProgressDialogのスタイル::

<resources> 
    <style name="MyProgressDialog" parent="@android:style/Theme.Dialog"> 
     <item name="android:background">@android:color/transparent</item> 
     <item name="android:backgroundDimEnabled">false</item> 
     <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:windowFrame">@null</item> 
     <item name="android:windowIsFloating">true</item> 
     <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> 
     <item name="android:windowTitleStyle">@null</item> 
    </style> 
</resources> 

マイProgressDialogクラス:

public class MyProgressDialog extends Dialog { 

    public MyProgressDialog(Context context) { 
     super(context, R.style.MyProgressDialog); 
    } 

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message) { 
     return show(context, title, message, false); 
    } 

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate) { 
     return show(context, title, message, indeterminate, false, null); 
    } 

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable) { 
     return show(context, title, message, indeterminate, cancelable, null); 
    } 

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable, OnCancelListener onCancelListener) { 
     MyProgressDialog dialog = new MyProgressDialog(context); 
     dialog.setCancelable(cancelable); 
     dialog.setOnCancelListener(onCancelListener); 
     dialog.setTitle(title); 

     dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     dialog.show(); 

     return dialog; 
    } 
} 

私はそれだけでタスクとProgressDialog取り扱いだ...など、あなたのUI、あなたのリストボックスの更新について話していません今度は牛肉が来る。 AsyncTaskを内部クラスとして持つListView。 AsyncTaskは、周囲のListActivity(コンテキスト)への参照を保持し、ListActivityはAsyncTaskへの参照を保持します。 ProgressDialogは通常の起動時にAsyncTaskに作成されます。 ListActivityが停止し、AsyncTaskがまだ実行されている場合、ダイアログはListActivityから破棄され、再起動後に再作成されます。

重要なことは、何をやっている人に気づくことです:私は(API 8を使用して)私のアプリケーションの一つで同じことをしなければならなかった

public class MyListActivity extends ListActivity { 

    private class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> { 

     /* package */ MyListActivity context; 
     /* package */ MyProgressDialog dialog; 

     public MyAsyncTask(MyListActivity context) { 
      super(); 

      this.context = context; 
     } 

     @Override 
     protected Boolean doInBackground(final Void... voids) { 
      Boolean rc = false; 

      // Put your running task here 

      return rc; 
     } 

     @Override 
     protected void onPostExecute(final Boolean result) { 
      if (dialog != null) { 
       try { 
        dialog.dismiss(); 
       } catch (Exception exception) { 
       } 

       dialog = null; 
      } 

      if (result) { 
       // Whatever you need to update in UI 
      } 

      context.task = null; 
     } 

     @Override 
     protected void onPreExecute() { 
      dialog = MyProgressDialog.show(context, null, null, true, false); 
     } 
    } 

    /* package */ MyAsyncTask task; 

    // Save AsyncTask if running, dismiss ProgressDialog if open 
    @Override 
    public Object onRetainNonConfigurationInstance() { 
     if (task != null) { 
      if (task.dialog != null) { 
       task.dialog.dismiss(); 
       task.dialog = null; 
      } 
     } 

     return task; 
    } 

    @Override 
    public void onCreate(final Bundle bundle) { 

     // Usual start here 

     // Was task running? 
     task = (MyAsyncTask) getLastNonConfigurationInstance(); 
     if (task != null) { 
      // Task was running, update context, restart ProgressDialog 
      task.context = this; 
      task.dialog = MyProgressDialog.show(this, null, null, true, false); 
     } else { 
      // Task was not running. Start from beginning 
      task = new MyAsyncTask(this); 
      task.execute(); 
     } 
    } 
+0

ありがとうございますが、これは私の状況には適していません。 asynctaskはバックグラウンドで実行されており、アクティビティが破棄された後で保存してから再利用します。私にとって、book_viewアクティビティはまだ同じクラスである可能性があります。このアクティビティにリエントリーするときは、ある条件でasynctaskを再利用する必要があります。つまり、asynctaskをダウンロードするブックの章は、ダウンロード中のbook_viewアクティビティにのみ再利用されるべきです。 – David

+0

元の投稿に、別のアクティビティに切り替えると書いています。これは、リストアクティビティが一時停止していることを意味します。私の例は、この目的のために正確に動作します。今、あなたは両方のアクティビティが同じクラスにあると書いていますか?あなたの時間を無駄にして申し訳ありません。 –

+0

あなたの時間を無駄にして申し訳ありません。とにかくありがとう。リストアクティビティは自分の状況で破壊されるかもしれませんが、同じアクティビティクラスのインスタンスに戻ったときに、何らかの指定された条件の進捗状況を取得する必要があります。 – David

0

。私は通知のバーにダウンロードの進行状況を表示することを選択し、私はそれを更新するためにサービスを使用しました。私のためにうまくいった。

私はAPI 8のアプリケーションを開発して以来、私はDownloadManagerクラスを使用できませんでしたが、それを見てみたいかもしれません。アプリケーションでAPI 9+を使用している場合は、プロセス自体を再コーディングするよりも適切です。

関連する問題