-2

私のアプリケーションではSplashScreen、5秒間表示されるaを作成し、その後、設定ファイルに保存されている値に応じてifelseの場合を実行します。設定ファイルに値が含まれている場合はAsyncTaskコードが実行され、含まれていない場合はログインフォームが読み込まれます。アプリケーションを実行しようとしたとき。スレッドはインテントの助けを借りてログインフォームに移動しますが、AsyncTask私のアプリケーションに関しては、強制終了エラーメッセージが表示されます。

これは私のSplashScreenコードです:

public class SplashScreen extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splashscreen);

    Thread timer = new Thread()
    {
        public void run()
        {
            try
            {
                sleep(5000);
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if(GoGolfPref.getEmail(SplashScreen.this)!=null && GoGolfPref.getPass(SplashScreen.this)!=null)
                {
                    new LoadingScreen(SplashScreen.this, SplashScreen.this).execute("login_page", Login.url+GoGolfPref.getEmail(SplashScreen.this)+"/"+GoGolfPref.getPass(SplashScreen.this));
                }
                else
                {
                    Intent in = new Intent(SplashScreen.this, Login.class);
                    startActivity(in);
                    finish();
                }
            }
        }
    };
    timer.start();
}

}

これは私が得ているエラーです:

08-29 07:25:58.040: E/AndroidRuntime(2365): FATAL EXCEPTION: Thread-10
08-29 07:25:58.040: E/AndroidRuntime(2365): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
08-29 07:25:58.040: E/AndroidRuntime(2365):     at android.os.Handler.<init>(Handler.java:121)
08-29 07:25:58.040: E/AndroidRuntime(2365):     at android.app.Dialog.<init>(Dialog.java:101)
08-29 07:25:58.040: E/AndroidRuntime(2365):     at android.app.AlertDialog.<init>(AlertDialog.java:63)
08-29 07:25:58.040: E/AndroidRuntime(2365):     at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
08-29 07:25:58.040: E/AndroidRuntime(2365):     at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
08-29 07:25:58.040: E/AndroidRuntime(2365):     at com.pnf.gogolf.LoadingScreen.<init>(LoadingScreen.java:130)
08-29 07:25:58.040: E/AndroidRuntime(2365):     at com.pnf.gogolf.SplashScreen$1.run(SplashScreen.java:32)

これを機能させる方法は?

前もって感謝します...

4

2 に答える 2

2

問題は、どこかでUIに変更を加えているが、UIスレッドでは変更が行われていないことです。ユーザーインターフェイスに関係することはすべて、UIスレッドで実行する必要があります。これを行うには、コードを別のランナブルにカプセル化し、runOnUiThread()を呼び出します。

runOnUiThread(new Runnable() {
  @Override
  public void run() {
   // set some text views or something
  }
}
于 2012-09-01T21:19:28.380 に答える
2

スレッドの代わりにハンドラーを使用するためのベストプラクティス。ハンドラーは実行中にUIを変更して、ハンドラーとスレッドについて詳しく知ることができるため、Androidでこのハンドラーとスレッドを確認するだけです。

于 2012-09-01T21:34:10.023 に答える