2016-07-26 2 views
5

angerufen hat, erhielt ich einen Fehler auf meiner Splashtätigkeit, als es Internet-Verbindung prüfte und es kein Internet gibt .Kann Handler innerhalb des Fadens nicht herstellen, der nicht Looper.prepare() auf Warnungsdialog thread

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) 

ich habe runOnUiThread() versucht, aber es immer noch nicht funktioniert .. hier ist mein splash Code

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(); 
     } 
    } 
} 

Antwort

5

In Android die Looper ist ein Warteschlangen-System, das eine Nachrichtenschleife läuft. Standardmäßig ist einem Thread kein Looper zugeordnet, wenn Sie ihn erstellen. Wenn Ihr AlertDialog versucht, die Nachrichtenwarteschlange zu verwenden, stürzt es ab.

Sie könnte einen Looper in Ihrem neuen Thread erstellen, aber Sie sollten wirklich einen AlertDialog auf dem Hauptthread verwenden. Dazu können Sie postDelayed Methode eines Handler verwenden:

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

in Ihrem onCreate Methode

+0

Ja, tatsächlich. UI-Arbeit sollte NUR im UI-Thread ausgeführt werden. – RabidMutant

+0

Es hat jedoch ein Problem: Netzwerkaktivität sollte nicht auf dem UIhread erfolgen. Siehe meine Antwort unten. – RabidMutant

0

Als Verfeinerung der frühere Frage, würde ich wahrscheinlich tun folgendes da die Netzwerkaktivität auf dem UI-Thread ist auch eine schlechte Idee:

einen Handler im onCreate Create():

mHandler = new Handler(); 

und Kontrolle noch laufen () In einem eigenen Thread, aber es leicht ändern:

Auf diese Weise UI uns auf dem UI-Thread getan und Netzwerk in einem anderen Thread getan.

Verwandte Themen