2011-06-24 23 views
2

私はいくつかのアクティビティを持っています。私がログイン画面を持っている主なアクティビティでは、ユーザがログインボタンを押すと、ユーザが認証されるまで進行状況ダイアログが表示されます。この時点で、ユーザーがデータを入力するためのいくつかのフィールドを持つ次のアクティビティをロードします。Android - スレッドを起動するとアプリがクラッシュする

ここで、ユーザーは何らかのデータを入力し、処理するためにボタンを押します。データは実際に処理されて表示される新しいアクティビティに渡されます。これは新しいスレッドを作成する場所で、thread.start()を呼び出すとクラッシュする場所です。なぜこれが起こっているのか分かりません。

両方のアクティビティがRunnableを実装しています。

pd = ProgressDialog.show(search_results.this, "", "Searching...", true, false); 
    Thread thread = new Thread(this); 
    thread.start(); 

私が使用している:私は以下の作成および最初のアクティビティのボタンを押すと、最後の1ののonCreateメソッドで()thread.start呼び出すために同じコードを使用してい

以下の同じコードを使用して、両方のスレッドを処理します。

public void run() { 
    handler.sendEmptyMessage(0); 
} 
private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) {    
      pd.dismiss();    
    } 
}; 

私に何かが不足していますか?なぜそれがクラッシュするのか分かりません。

+0

エラーのスタックトレースを投稿できますか? –

答えて

0

タブレットの開発時に同じ問題が発生しました。特定のAPIの後、私は3.0(sdk 11)を考えています。Androidはアプリケーションが別のスレッドで長時間実行されているプロセスを実行するように強制します。 Logcatがこれを確認します。

私はあなたが別のスレッドを使用していることを知っていますが、それは私にとってもうまくいきませんでした。 AsyncTaskをお試しください。私の意見では、自分のスレッドを処理するよりも簡単なクイックインナークラスを作成することができます。 AsyncTaskには、UIスレッド上で動作するいくつかの関数と、独自のスレッド上で動作するいくつかの関数があります。これにより、ユーザーインターフェイスのスレッドで「読み込み」ユーザーインターフェイスオブジェクトを開始し、バックエンドスレッドで処理し、完了したらユーザーインターフェイスのスレッド関数に通知します。あなたは、具体的オーバーライド

onPreExecute(見たいと思うでしょう

) doInBackground() onPostExecute()

+0

このメソッドは働いて、助けてくれてありがとう。 – Scott

4

私はAsyncTaskを使用するために人々を励ますが、それは特に簡単のために、本当に必要ではありません進捗状況/読み込みダイアログなどがあります。それはではなく、の問題です。

あなたの質問とコードは混乱しています。どのコードがどのアクティビティにあるのかわかりませんし、アクティビティ間でダイアログを開いたままにしておかないといけないと思っています(それらはもちろん動作しません)。また、ThreadContextを指定しても、コンパイルされません(設計時にエラーが記録されます)。それをすべて集約するために、あなたはLogエントリを提供しませんでした。申し訳ありませんが、私はあなたがやっていることやエラーがどこにあるのか理解できません。私たちは推測するしかありません。

以下は、HandlerRunnableThreadで行う方法の1つです。これは、初めて使用する方法を学ぶときに開発者リソースから取得されました。

1- Handlerと宣言しています。ほとんどの人は、多くの場合、それを再利用するonCreateセクションに次の操作を行います。

必要
Handler mHandler = new Handler(); 

2-、あなたが開始Thread

new Thread() { public void run() { 
    mHandler.post(mLoadingData); 
    // ... do work 
    mHandler.post(mLoadingDataStop); 
}}.start() 

3 - これらは、に掲載されているRunnable sがありますHandler:プログレスダイアログの

private final Runnable mLoadingData = new Runnable() {public void run() { 
    showDialog(LOADING_DIALOG); // In your case, show your custom dialog 
}}; 

private final Runnable mLoadingDataStop = new Runnable() {public void run() { 
    dismissDialog(LOADING_DIALOG); // In your case, dismiss the dialog 
}}; 

は、物事は(進捗状況などを更新)もう少し作業が必要ですが、読み込みダイアログのために、あなたはしないでくださいメッセージを本当に混乱させる必要があります。

+0

うわー、私は答えて、実行可能な解決策を掲示しようとしていますか? (おそらく、あなたが望む/必要とするものではないにしても)Sheesh。これが建設的な場所なら、少なくとも私は自分自身を改善できるようにフィードバックを得ているはずです。 – davidcesarino

+1

よく言った...アップ投票した:) –

関連する問題