2016-07-26 9 views
5

iletiþiminde iletiþim oluþturulamıyor. Internet bağlantýsý kontrol edildiðinde ve internet yokken çalþtýrma etkinliğimde bir hata oluþtum .. Uyarı iletisimde oldu .Looper.prepare() iletiþim iletiþim iletiþim kutusunda LoList.prepare() iletiþim iletiþiminde

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) 

i runOnUiThread() denedim ama yine de değil çalışır .. burada Looper bir ileti döngüsü çalışan bir kuyruk sistemidir Android'de benim sıçrama kodu

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

cevap

5

bu. Varsayılan olarak, bir iş parçacığı oluşturduğunuzda ilişkili bir Looper yok. Böylece, AlertDialog'nuz kilitlediği ileti sırasını kullanmaya çalıştığında.

yeni iş parçacığınızda bir Looper oluşturmak olabilir, ancak gerçekten ana iş parçacığı üzerinde bir AlertDialog kullanmanız gerekir. Yapmam muhtemelen ediyorum UI iş parçacığı üzerinde ağ etkinliği de aşağıdaki beri önceki soruya rafinaj olarak sizin onCreate yöntemle

+0

Evet, gerçekten. UI çalışması SADECE UI iş parçacığı üzerinde yapılmalıdır. – RabidMutant

+0

Ancak bir sorunu var: ağ etkinliği UI iş parçacığı üzerinde yapılmamalıdır. Cevabımı aşağıya bakın. – RabidMutant

0

yılında

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

: Bunu yapmak için bir Handler ait postDelayed yöntemi kullanabilirsiniz kötü bir fikir:

onCreate bir işleyici (oluştur): hala

mHandler = new Handler(); 

Ve kontrol çalıştırın () O kendi iş parçacığı, ama biraz değiştirmek:

Bu şekilde, bize UI iş parçacığı üzerinde yapılan UI ve ağ başka bir iş parçacığı yapılır.