2016-07-26 11 views
5

tôi gặp lỗi trên hoạt động giật gân khi kiểm tra kết nối internet và không có internet. .Không thể tạo bộ xử lý bên trong luồng không được gọi là Looper.prepare() trên chuỗi hội thoại cảnh báo

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) 

tôi đã cố gắng runOnUiThread() nhưng nó vẫn không hoạt động .. đây là mã giật gân của tôi

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

Trả lời

5

Trong Android Looper là một hệ thống hàng đợi chạy một vòng lặp thông điệp. Theo mặc định, một Thread không có Looper liên kết với nó khi bạn tạo nó. Như vậy khi AlertDialog của bạn cố gắng sử dụng hàng đợi tin nhắn nó treo.

Bạn có thể tạo Looper trong chủ đề mới của bạn tuy nhiên bạn thực sự nên sử dụng AlertDialog trên chuỗi chính. Để thực hiện điều này, bạn có thể sử dụng postDelayed phương pháp của một Handler:

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

trong onCreate phương pháp của bạn

+0

Có, thực sự. Chỉ nên thực hiện công việc giao diện người dùng trên chuỗi giao diện người dùng. – RabidMutant

+0

Nó có một vấn đề mặc dù: hoạt động mạng KHÔNG nên được thực hiện trên thread UI. Xem câu trả lời của tôi dưới đây. – RabidMutant

0

Như một sàng lọc cho câu hỏi trước đó, tôi có lẽ sẽ làm như sau kể từ khi hoạt động mạng trên thread UI cũng là một ý tưởng tồi:

Tạo một Handler trong onCreate():

mHandler = new Handler(); 

Và vẫn chạy kiểm tra () theo chủ đề riêng, nhưng thay đổi một chút:

Bằng cách này, giao diện người dùng chúng tôi thực hiện trên chuỗi giao diện người dùng và mạng được thực hiện trong chuỗi khác.

Các vấn đề liên quan