2011-12-24 6 views
0

の進捗ダイアログを表示するためにスレッドを使用すると、コードのいくつかのビットです:ここでAndroidの

public class ShowDialog extends Thread { 
private static String mTitle="Please wait"; 
private static String mText="Loading..."; 
private Activity mActivity; 
private ProgressDialog mDialog; 

ShowDialog(Activity activity) { 
    this(activity, mTitle, mText); 
} 
ShowDialog(Activity activity, String title) { 
    this(activity, title, mText); 
} 
ShowDialog(Activity activity, String title, String text) { 
    super(); 
    mText=text; 
    mTitle=title; 
    mActivity=activity; 
    if (mDialog == null) { 
     mDialog = new ProgressDialog(mActivity); 
     mDialog.setTitle(mTitle); 
     mDialog.setMessage(mText); 
     mDialog.setIndeterminate(true); 
     mDialog.setCancelable(true); 
     mDialog.setOnCancelListener(
      new DialogInterface.OnCancelListener() { 
       @Override 
       public void onCancel(DialogInterface arg0) { 
        mDialog.dismiss(); 
        interrupt(); 
       } 
      }); 
    } 
} 

public void run() { 
    mDialog.show(); 
    while(!isInterrupted()) 
    mDialog.dismiss(); 
    mDialog=null; 
} 

}

そして、私の主な活動で:

ShowDialog show = new ShowDialog(this, "Please wait!","Loading badly..."); 
    show.start(); 
    SystemClock.sleep(2000); 
    show.interrupt(); 

私がかもしれない知っています非同期タスクとすべてのものを使用しますが、それは私が望むものではありません。しばらく時間がかかるものでSystemClock.sleepを置き換えてください。アイデアは、UIスレッドで開始と割り込みの間でコードを実行し、ProgressDialogを処理する別々のスレッドを作成することです。 スレッドで何が問題になっていますか?

ありがとうございます!

答えて

2

スレッドが完了するまで待つには、Thread.join()メソッドを使用する必要があります。しかし、今はあなたがそれが完了するのを待つことを望んでいないのが分かりますが、完了するときを制御する必要があります。それでも、この方法でスレッドを中断しないようにする必要があります。あなたのShowDialogクラスで

、あなたが代わりにinterrupt()の、あなたのmainから呼び出すことができますdismiss()メソッドを追加します。また、boolean dismiss = falseインスタンス変数を追加します。 dismiss()には、dismiss = trueを追加し、次にnotify();を追加します。 run()では、定数while()ループ(常に実行され、非常に非効率的でした)をwhile(!dismiss){wait()}に置き換えてください。あなたはまだ同期ブロックと例外処理を追加する必要がありますが、これは良いスタートにあなたをオフにする必要があります。あなたはAsyncTaskを使いたくありませんでしたが、私はまだ考え直すだろう言及

public static class ShowDialog extends Thread{ 

    protected boolean dismiss; 

    public void dismiss(){ 
     dismiss = true; 
     synchronized(this){ 
      notifyAll(); 
     } 
    } 

    @Override 
    public void run(){ 
     System.out.println("Running..."); 
     // Show your dialog here. 
     while(!dismiss){ 
      synchronized(this){ 
       try{ 
        wait(); 
       }catch(InterruptedException ie){ 
        ie.printStackTrace(); 
       } 
      } 
     } 
     System.out.println("Quitting..."); 
     // Dismiss your dialog here. 
    } 

} 

public static void main(String[] args) throws Exception{ 
    ShowDialog sd = new ShowDialog(); 
    sd.start(); 
    Thread.sleep(2000); 
    sd.dismiss(); 
} 

:ここ

は、一般的なJavaの(非アンドロイド)簡単な例です。 (あなたの理由は何ですか?)

+0

したがって、Thread.start()の代わりにThread.join()を使用する必要がありますか? –

+0

@Flav - いいえ、あなたの 'sleep'ステートメントの代わりに' show.join() 'を呼び出してください。しかし、今私はあなたがここで何をしようとしているのが良く見えます。フォローしている更新された答え... – ziesemer

関連する問題