2010-11-23 15 views
7

ちょっとした人よ、 アクティビティを開く際の進捗状況ダイアログ(例ではアクティビティ2と呼ばれる)に問題があります。 アクティビティ2には、このOnCreateイベントで実行するコードが多数あります。開かれたアクティビティの進捗状況ダイアログ

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true); 
new Thread() { 
    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       showApps(); 
      } 
     }); 
     myProgressDialog.dismiss(); 
    } 
}.start(); 

showApps機能の起動アクティビティ2

私は活動1に私のボタンのクリックイベントにこのコードを実行する場合、私は進行状況を確認するが、彼女は移動していない私は、黒い画面を持っているafeter 2〜3秒の間にアンドロイドが活動を示す時間。

Activity2のOnCreateでこのコードを実行し、OnCreateのコードでshowAppsを置き換えた場合、Activity1は2秒間フリーズしますが、進行状況ダイアログは表示されず、アクティビティ2を2秒間もう一度フリーズします結果。

アイデア?

+0

あなたはUIスレッドで実行されるコードを実行するスレッドを作成します!これは私が知る必要があるハック/回避策ですか、これは間違っていますか? – WarrenFaith

+0

こんにちは@WarrenFaith、あなたは私をしっかりと蹴り、この質問への私の一番の投票の答えを受け入れることができますか? –

+0

@ダーレンは私の質問ではありません:) – WarrenFaith

答えて

10

私は同じ問題を抱えており、AsyncTaskが私のために働いています。

AsyncTaskでオーバーライドする3つの重要な方法があります。

  1. doInBackground:あなたの背景 処理の肉が発生する場所です。
  2. onPreExecute:ここにあなたのProgressDialogを表示(ShowDialogを)
  3. onPostExecute:ここにあなたのProgressDialogを隠す(removeDialogまたはdismissDialog )あなたがあなたの活動の内部クラスとしてごAsyncTaskのサブクラスを作る場合

AsyncActivity内からフレームワークメソッドshowDialog、dismissDialog、およびremoveDialogを呼び出すことができます。

はここAsyncTaskのサンプル実装です:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> { 
    @Override 
    protected Boolean doInBackground(String... params) { 
    try { 
     Thread.sleep(4000); // Do your real work here 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return Boolean.TRUE; // Return your real result here 
    } 
    @Override 
    protected void onPreExecute() { 
    showDialog(AUTHORIZING_DIALOG); 
    } 
    @Override 
    protected void onPostExecute(Boolean result) { 
    // result is the value returned from doInBackground 
    removeDialog(AUTHORIZING_DIALOG); 
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class); 
    startActivity(i); 
    } 
} 
2

AFAIK進行状況ダイアログが表示されているアクティビティを事前に読み込むことはできません。実際のデバイスやエミュレータでテストしていますか?

私は進行中のアニメーションを中央に持つViewFlipperでアクティビティを開き、次のビューでアクティビティをロードするという回避策を見たことがありますが、アクティビティはロードされていますが、願い。

+0

ええ私は同じ結果で両方のテストをしましたが、エミュレータでは速く、インストールされているすべてのアプリケーションでアクティビティを起動し、エミュレータではほとんど動作しません。私が望むようなものではありません:/ – Pachanka

3

GeeXor

私はOnCreateイベントでの操作の活動2のOnCreate.Writingロットでの操作の多くを実行する避けるために、あなたを示唆している非同期AsyncTaskかでを使用してこれらの操作を実行activities.So間の黒い画面の理由ですスレッド(または避けられない場合はスタートに書き込みます)。

もう1つの提案は、すべてのデータがロードされるまで実行されるアクティビティ2のonCreateで別のprogressDialogを開始することです。&ユーザーは何かがバックグラウンドで発生していることを知ります。

+0

ok、私は今夜、答えをopstになります。 – Pachanka

0

これは私がやることです。 uiスレッドでハンドラを作成し、バックグラウンド処理スレッドを開始して、progressdialogを表示します。バックグラウンドスレッドが終了したら、ハンドラを介してuiスレッドにrunnableをポストしてダイアログを閉じるようにします。

+0

ハム私はアクティビティ(上または下に直接進行中のダイアログのような小さなホイールで多くのアプリケーションを見たことがありますアクティビティで)。それは何ですか ? – Pachanka

+0

'Activity.setProgress'を見てください。アクティビティのタイトルバーに小さな回転ホイールを設定するためのオプションがいくつかあります。 – techiServices

+0

OK、ここで解決策を見つけました:http://stackoverflow.com/questions/3893626/how-to-use-asynctask-to-show-a-progressdialog-while-doing-background-work-in-andr – Pachanka

関連する問題