2016-09-25 3 views
0

Android用のHTMLダウンローダをコーディングしたので、ProgressBarを使用することにしましたが、java.lang.IllegalStateException: The current thread must have a looper!を投げました。私は、この例外は、メインスレッドで関数を呼び出す必要があるときにスローされることを知っていますが、内部で呼び出されましたrunOnUiThread()以下のコードを見てください。runOnUiThreadのProgressBarルーパー例外

//Inside a worker thread's run() 
progressbar.setInterminate(true); //No Exception here 
//Connect and get InputStream. 
progressbar.setMax(conn.getContentLength()); //No exception here, too 
progressbar.setProgress(0); //No exception here. 
runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     progressbar.setInterminate(false); //Exception here! 
    } 
}); 

私はsetInterminate(false)以下setProgress()を移動しようとしたが、それは何もしませんでした。

ありがとうございます。

+0

あなたのワーカースレッドは何かをダウンロードするために1回だけ実行されると仮定しますか?そうですか? –

+0

@Infernoあなたは正しいです。たぶん私はそれをアーカイブするために共有価値を使用すべきですか? – minary

+0

そして、「進歩」とは何ですか?それはどこから来ていますか?あなたは2つの異なるプログレスバーオブジェクトを持っているようです: 'progressbar'と' progress'。詳細を記入し、スタックトレースを追加してください。 –

答えて

0

私はプログラミングが新しく、HTMLダウンローダなどについては何も知らないけど、助けようとします。私が読んだことから、デフォルトのメインスレッドは、新しいスレッドが作成されない限り、すべてが実行される場所です。では、progress.setInterminate(false);が新しいスレッドではなくprogressbar.setProgress(0);の横にあるとどうなりますか?

+0

まあ、コードが言うように、//ワーカースレッドのrun()の内部では、上記のコードは新しいスレッドで*です。また、 'runOnUiThread(Runnable r)'関数は、メインスレッド*でr *を実行します。また、Androidはメインスレッドからネットワークにアクセスできないため、ここでは新しいスレッドを使用する必要がありました。 (ブロッキングの問題のため) – minary

+0

すみません、私は助けになることはできませんでした。誰も答えなかったので、私はそれを撃った。あなたの問題で幸運!役に立たないと私の答えを削除する場合は、単にそう言いなさい。 –