2016-07-26 20 views
5

インターネット接続がチェックされ、インターネットがないときにスプラッシュアクティビティでエラーが発生しました。 。アンドロイドでアラートダイアログスレッドでLooper.prepare()を呼び出していないスレッド内でハンドラを作成できません

私は runOnUiThread()を試してみましたが、それはまだ動作しない
java.lang.RuntimeException: 
Can't create handler inside thread that has not called Looper.prepare() 
at android.os.Handler.<init>(Handler.java:200)         
at android.os.Handler.<init>(Handler.java:114)        
at android.app.Dialog.<init>(Dialog.java:108)       
at android.app.Dialog.<init>(Dialog.java:148)    
at android.support.v7.app.AppCompatDialog.<init>(AppCompatDialog.java:43)   
at android.support.v7.app.AlertDialog.<init>(AlertDialog.java:95)     
at android.support.v7.app.AlertDialog$Builder.create(AlertDialog.java:927)   
at com.example.study.Splash.checking(Splash.java:66) 
at com.example.study.Splash$2.run(Splash.java:51) 

.. ここに私のスプラッシュコードだ

package com.example.study; 

import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 

import com.example.study.helper.SessionManager; 
import com.example.study.util.ConnectionDetector; 

public class Splash extends AppCompatActivity { 

    private ConnectionDetector cd; 
    Boolean isInternetPresent = false; 
    protected SessionManager session; 

    private AlertDialog.Builder builder; 


    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 


     builder = new AlertDialog.Builder(Splash.this); 

     session = new SessionManager(getApplicationContext()); 
     cd = new ConnectionDetector(getApplicationContext()); 

     builder.setTitle("No Connection"); 
     builder.setMessage("Check Your Internet Connection."); 
     builder.setIcon(R.drawable.fail); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int id) { 

        /* TODO Auto-generated method stub */ 
       dialog.dismiss(); 
      } 
     }); 

     Thread timer = new Thread(){ 
      public void run(){ 
       try { 
        sleep(2000); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        checking(); 
       } 
      } 
     }; 
     timer.start(); 
    } 

    public void checking() { 

     isInternetPresent = cd.isConnectingToInternet(); 

     if(isInternetPresent) { 
      session.checkLogin(); 
      finish(); 
     } else { 
      builder.create().show(); 
      finish(); 
     } 
    } 
} 

答えて

5

Looperメッセージループを実行し、キューシステムです。デフォルトでは、作成時にスレッドに関連付けられたルーパはありません。そのため、AlertDialogがメッセージキューを使用しようとするとクラッシュします。

新しいスレッドではルーパーを作成しますが、実際にはメインスレッドでAlertDialogを使用する必要があります。これを行うには、あなたがHandlerpostDelayed方法使用することができます。以前の質問への改良としてごonCreate方法

+0

はい、実際です。 UI作業は、UIスレッドでのみ行う必要があります。 – RabidMutant

+0

それにもかかわらず、1つの問題があります:ネットワークの活動は、UIスレッドで行うべきではありません。下の私の答えを見てください。 – RabidMutant

0

new Handler().postDelayed(
     new Runnable() { 
      @Override 
      public void run() { 
       checking(); 
      } 
     }, 
     2000 
); 

をUIスレッド上のネットワークアクティビティでもあるので、私はおそらく、次の操作を行います悪いアイデア:

)のonCreate(中ハンドラを作成します。

mHandler = new Handler(); 

そして、まだはチェックを実行します( )それ自身のスレッドではなく、少しそれを変更:

このように、私たちは、UIスレッド上で行われたUIとネットワークが別のスレッドで行われます。

関連する問題