alertdialog误差事件 [英] alertdialog error with events

查看:149
本文介绍了alertdialog误差事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

修改:增加了额外的错误和修改到code I提出

我是新来的Java / Android的。我想我的SmartApp类中创建一个AlertDialog当事件在我DataRobot类被激发。这样做的时候,我得到一个错误。该事件被触发,并在SmartApp成功调用该函数,但是当它到达 AlertDialog警报=新AlertDialog.Builder(本).create(); 打印以下错误到logcat中。有谁知道我做错了或者更好的方式来实现我想我什么?

  logcat的错误:
02-05 22:39:27.081:VERBOSE / SmartApp(281):数据警报事件捕获
02-05 22:39:27.081:VERBOSE / SmartApp(281):内请将SendAlert
02-05 22:39:27.090:警告/ System.err的(281):了java.lang.RuntimeException:无法内螺纹创建的处理程序已经不叫尺蠖prepare()。
02-05 22:39:27.122:WARN / System.err的(281):在android.os.Handler<&初始化GT;(Handler.java:121)。
02-05 22:39:27.122:WARN / System.err的(281):在android.app.Dialog<&初始化GT;(Dialog.java:101)。
02-05 22:39:27.141:WARN / System.err的(281):在android.app.AlertDialog<&初始化GT;(AlertDialog.java:63)。
02-05 22:39:27.141:WARN / System.err的(281):在android.app.AlertDialog<&初始化GT;(AlertDialog.java:59)。
02-05 22:39:27.161:WARN / System.err的(281):在android.app.AlertDialog $ Builder.create(AlertDialog.java:786)
02-05 22:39:27.161:WARN / System.err的(281):在cpe495.smartapp.SmartApp.sendAlert(SmartApp.java:169)
02-05 22:39:27.171:WARN / System.err的(281):在cpe495.smartapp.SmartApp $ 3.dataAlertReceived(SmartApp.java:59)
02-05 22:39:27.201:WARN / System.err的(281):在cpe495.smartapp.DataRobot.fireDataAlertEvent(DataRobot.java:96)
02-05 22:39:27.201:WARN / System.err的(281):在cpe495.smartapp.DataRobot.analyzeData(DataRobot.java:32)
02-05 22:39:27.211:WARN / System.err的(281):在cpe495.smartapp.SmartApp $ 1.dataReceivedReceived(SmartApp.java:45)
02-05 22:39:27.222:WARN / System.err的(281):在cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:71)
02-05 22:39:27.222:WARN / System.err的(281):在cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:42)
02-05 22:39:27.242:WARN / System.err的(281):在java.lang.Thread.run(Thread.java:1096)


  //我smartapp类主界面
公共类SmartApp扩展活动实现OnShared $ P $ {pferenceChangeListener
    TextView的smartConnectionStatus;
    TextView的testOutputView;
    螺纹cThread;
    私人ConnectDevice CD =新ConnectDevice();
    私人DataRobot的dR =新DataRobot();
    私人DataBuilder分贝=新DataBuilder();
    私人DataSender DS =新DataSender();
    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.intro);        cD.addDataReceivedListener(新DataReceivedListener(){
            @覆盖
            公共无效dataReceivedReceived(DataReceivedEvent事件){
                // TODO自动生成方法存根
                dR.analyzeData(event.getData());
            }
        });
        dR.addDataAlertListener(新DataAlertListener(){
            @覆盖
            公共无效dataAlertReceived(DataAlertEvent事件){
                Log.v(SmartApp,数据警报事件陷入);
                请将SendAlert();
            }
        });
    }
    / *发送警报用户已超过压力指数函数* /
    公共无效请将SendAlert(){
        Log.v(SmartApp,内部请将SendAlert);
        AlertDialog警报=新AlertDialog.Builder(本).create();
        Log.v(SmartApp,助洗剂后);
        //振动器振动;
        //振动器=(振动器)getSystemService(Context.VIBRATOR_SERVICE);
        //vibrator.vibrate(500);
        alert.setMessage(测试警告对话框......);
        alert.setCancelable(假);
        alert.setButton(OK,新DialogInterface.OnClickListener(){
            @覆盖
            公共无效的onClick(DialogInterface对话,诠释它){
                // TODO自动生成方法存根
                dialog.cancel();
            }
        });
        Log.v(SmartApp,builder2后);
        // AlertDialog警报= builder.create();
        alert.setTitle(标题);
        Log.v(SmartApp,builder3后);
        alert.show();
        Log.v(SmartApp,builder4后);
    }}


  // datarobot类
公共类DataRobot延伸活动{
/ *这个类是分析数据* /
私人列表_listeners =新的ArrayList();
私人列表< D​​ataAlertListener> _listeners2 =新的ArrayList< D​​ataAlertListener>();
私人SmartDataObject数据;
私人诠释SI1;
私人诠释SI2;
私人浮动W1;
私人浮动W2;
私人浮动W3;
私人诠释HRB;
私人诠释hRVMin;
私人诠释hRVMax;公共布尔analyzeData(SmartDataObject临时){
    / *分析数据
     *如果成功分析的数据,则返回true
     *如果出现错误,则返回false
     * /
    数据=温度;
    如果(data.getHeartRate()> 290){
        fireDataAlertEvent();
    }
    fireDataAnalyzedEvent(数据);
    返回true; //现在这将始终返回true
}公共同步无效addDataAnalyzedListener(DataAnalyzedListener监听){
    _listeners.add(监听);
}
公共同步无效removeDataAnalyzedListener(DataAnalyzedListener监听){
    _listeners.remove(监听);
}
私人同步无效fireDataAnalyzedEvent(SmartDataObject临时){
    DataAnalyzedEvent DRE =新DataAnalyzedEvent(这一点,温度);
    迭代器监听= _listeners.iterator();
    而(listeners.hasNext()){
        ((DataAnalyzedListener)listeners.next())dataAnalyzedReceived(DRE)。
    }
}
公共接口DataAnalyzedListener {
    公共无效dataAnalyzedReceived(DataAnalyzedEvent事件);
}公共同步无效addDataAlertListener(DataAlertListener监听){
    _listeners2.add(监听);
}
公共同步无效removeDataAlertListener(DataAlertListener监听){
    _listeners2.remove(监听);
}
私人同步无效fireDataAlertEvent(){
    DataAlertEvent DAE =新DataAlertEvent(本);
    迭代器监听= _listeners2.iterator();
    而(listeners.hasNext()){
        ((DataAlertListener)listeners.next())dataAlertReceived(DAE)。
    }
}
公共接口DataAlertListener {
    公共无效dataAlertReceived(DataAlertEvent事件);
}
}


 公共类DataAlertEvent扩展的EventObject {
    公共DataAlertEvent(对象源){
        超(源);
        // TODO自动生成构造函数存根
    }
}


下面是试图修复后加code

  10月2日至6日:27:30.673:VERBOSE / SmartApp(276):数据警报事件捕获
10月2日至六日:27:31.013:警告/ System.err的(276):了java.lang.RuntimeException:无法内螺纹创建的处理程序已经不叫尺蠖prepare()。
10月2日至六日:27:31.042:WARN / System.err的(276):在android.os.Handler<&初始化GT;(Handler.java:121)。
10月2日至六日:27:31.052:WARN / System.err的(276):在android.view.ViewRoot<&初始化GT;(ViewRoot.java:231)。
10月2日至六日:27:31.052:WARN / System.err的(276):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
10月2日至六日:27:31.062:WARN / System.err的(276):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10月2日至六日:27:31.082:WARN / System.err的(276):在android.view.Window $ LocalWindowManager.addView(Window.java:424)
10月2日至六日:27:31.082:WARN / System.err的(276):在android.app.Dialog.show(Dialog.java:241)
10月2日至六日:27:31.102:WARN / System.err的(276):在cpe495.smartapp.SmartApp $ 4.dataAlertReceived(SmartApp.java:80)
10月2日至六日:27:31.102:WARN / System.err的(276):在cpe495.smartapp.DataRobot.fireDataAlertEvent(DataRobot.java:96)
10月2日至六日:27:31.122:WARN / System.err的(276):在cpe495.smartapp.DataRobot.analyzeData(DataRobot.java:32)
10月2日至六日:27:31.122:WARN / System.err的(276):在cpe495.smartapp.SmartApp $ 2.dataReceivedReceived(SmartApp.java:66)
10月2日至六日:27:31.133:WARN / System.err的(276):在cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:71)
10月2日至六日:27:31.133:WARN / System.err的(276):在cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:42)
10月2日至六日:27:31.153:WARN / System.err的(276):在java.lang.Thread.run(Thread.java:1096)


 公共类SmartApp扩展活动实现OnShared $ P $ {pferenceChangeListener
    TextView的smartConnectionStatus;
    TextView的testOutputView;
    螺纹cThread;
    私人ConnectDevice CD =新ConnectDevice();
    私人DataRobot的dR =新DataRobot();
    私人DataBuilder分贝=新DataBuilder();
    私人DataSender DS =新DataSender();
    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.intro);    最后AlertDialog警报=新AlertDialog.Builder(本).create();
    Log.v(SmartApp,内部请将SendAlert);
    // AlertDialog警报=新AlertDialog.Builder(本).create();
    Log.v(SmartApp,助洗剂后);
    //振动器振动;
    //振动器=(振动器)getSystemService(Context.VIBRATOR_SERVICE);
    //vibrator.vibrate(500);
    alert.setMessage(测试警告对话框......);
    alert.setCancelable(假);
    alert.setButton(OK,新DialogInterface.OnClickListener(){
        @覆盖
        公共无效的onClick(DialogInterface对话,诠释它){
            // TODO自动生成方法存根
            dialog.cancel();
        }
    });
    Log.v(SmartApp,builder2后);
    // AlertDialog警报= builder.create();
    alert.setTitle(标题);        cD.addDataReceivedListener(新DataReceivedListener(){
            @覆盖
            公共无效dataReceivedReceived(DataReceivedEvent事件){
                // TODO自动生成方法存根
                dR.analyzeData(event.getData());
            }
        });
        dR.addDataAlertListener(新DataAlertListener(){
            @覆盖
            公共无效dataAlertReceived(DataAlertEvent事件){
                Log.v(SmartApp,数据警报事件陷入);
                请将SendAlert();
                            alert.show();
            }
        });
    }}


解决方案

您必须创建在UI线程自动显示警告对话框,或:


  1. 创建UI线程处理程序。

     处理程序mHandler =新的处理程序();


  2. 创建一个线程

      A类实现Runnable {
        公共无效的run(){
            //此处创建和显示警告
        }
    }


  3. 当事件被激活,请致电:

      A A =新的A();
    mHandler.post(一);


EDIT: Added an additional error and the revision to the code i made.

I am new to java/android. I am trying to create an AlertDialog inside my SmartApp class when an event is fired in my DataRobot class. I am getting an error when doing this. The event is firing and calling the function successfully in SmartApp, but when it gets to AlertDialog alert = new AlertDialog.Builder(this).create(); the following error is printed to logcat. Does anyone know what i am doing wrong or a better way to implement what i am wanting?

Logcat error:
02-05 22:39:27.081: VERBOSE/SmartApp(281): data alert event caught
02-05 22:39:27.081: VERBOSE/SmartApp(281): inside sendalert
02-05 22:39:27.090: WARN/System.err(281): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-05 22:39:27.122: WARN/System.err(281):     at android.os.Handler.<init>(Handler.java:121)
02-05 22:39:27.122: WARN/System.err(281):     at android.app.Dialog.<init>(Dialog.java:101)
02-05 22:39:27.141: WARN/System.err(281):     at android.app.AlertDialog.<init>(AlertDialog.java:63)
02-05 22:39:27.141: WARN/System.err(281):     at android.app.AlertDialog.<init>(AlertDialog.java:59)
02-05 22:39:27.161: WARN/System.err(281):     at android.app.AlertDialog$Builder.create(AlertDialog.java:786)
02-05 22:39:27.161: WARN/System.err(281):     at cpe495.smartapp.SmartApp.sendAlert(SmartApp.java:169)
02-05 22:39:27.171: WARN/System.err(281):     at cpe495.smartapp.SmartApp$3.dataAlertReceived(SmartApp.java:59)
02-05 22:39:27.201: WARN/System.err(281):     at cpe495.smartapp.DataRobot.fireDataAlertEvent(DataRobot.java:96)
02-05 22:39:27.201: WARN/System.err(281):     at cpe495.smartapp.DataRobot.analyzeData(DataRobot.java:32)
02-05 22:39:27.211: WARN/System.err(281):     at cpe495.smartapp.SmartApp$1.dataReceivedReceived(SmartApp.java:45)
02-05 22:39:27.222: WARN/System.err(281):     at cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:71)
02-05 22:39:27.222: WARN/System.err(281):     at cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:42)
02-05 22:39:27.242: WARN/System.err(281):     at java.lang.Thread.run(Thread.java:1096)   


//my smartapp class main ui
public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {
    TextView smartConnectionStatus;
    TextView testOutputView;
    Thread cThread;
    private ConnectDevice cD = new ConnectDevice();
    private DataRobot dR = new DataRobot();
    private DataBuilder dB = new DataBuilder();
    private DataSender dS = new DataSender();


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intro);



        cD.addDataReceivedListener(new DataReceivedListener() {
            @Override
            public void dataReceivedReceived(DataReceivedEvent event) {
                // TODO Auto-generated method stub
                dR.analyzeData(event.getData());
            }
        });
        dR.addDataAlertListener(new DataAlertListener() {
            @Override
            public void dataAlertReceived(DataAlertEvent event) {
                Log.v("SmartApp", "data alert event caught");
                sendAlert();
            }
        });
    }
    /* Function for sending alerts that the user has exceeded a stress index */
    public void sendAlert() {
        Log.v("SmartApp", "inside sendalert");
        AlertDialog alert = new AlertDialog.Builder(this).create();
        Log.v("SmartApp", "after builder1");
        //Vibrator vibrator;
        //vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        //vibrator.vibrate(500);
        alert.setMessage("Testing alert dialog...");
        alert.setCancelable(false);
        alert.setButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.cancel();
            }
        });
        Log.v("SmartApp", "after builder2");
        //AlertDialog alert = builder.create();
        alert.setTitle("Title");
        Log.v("SmartApp", "after builder3");
        alert.show();
        Log.v("SmartApp", "after builder4");
    }

}   


// datarobot class
public class DataRobot extends Activity {
/* This class is for analyzing the data */
private List _listeners = new ArrayList();
private List<DataAlertListener> _listeners2 = new ArrayList<DataAlertListener>();
private SmartDataObject data;
private int sI1;
private int sI2;
private float w1;
private float w2;
private float w3;
private int hRB;
private int hRVMin;
private int hRVMax;

public boolean analyzeData(SmartDataObject temp) {
    /* Analyze the data
     * Returns true if data was successfully analyzed
     * Returns false if an error occurred
     */
    data = temp;
    if(data.getHeartRate()>290) {
        fireDataAlertEvent();
    }
    fireDataAnalyzedEvent(data);
    return true; //for now this will always return true
}

public synchronized void addDataAnalyzedListener(DataAnalyzedListener listener) {
    _listeners.add(listener);
}
public synchronized void removeDataAnalyzedListener(DataAnalyzedListener listener) {
    _listeners.remove(listener);
}
private synchronized void fireDataAnalyzedEvent(SmartDataObject temp) {
    DataAnalyzedEvent dRE = new DataAnalyzedEvent(this, temp);
    Iterator listeners = _listeners.iterator();
    while(listeners.hasNext()) {
        ((DataAnalyzedListener)listeners.next()).dataAnalyzedReceived(dRE);
    }
}
public interface DataAnalyzedListener {
    public void dataAnalyzedReceived(DataAnalyzedEvent event);
}



public synchronized void addDataAlertListener(DataAlertListener listener) {
    _listeners2.add(listener);
}
public synchronized void removeDataAlertListener(DataAlertListener listener) {
    _listeners2.remove(listener);
}
private synchronized void fireDataAlertEvent() {
    DataAlertEvent dAE = new DataAlertEvent(this);
    Iterator listeners = _listeners2.iterator();
    while(listeners.hasNext()) {
        ((DataAlertListener)listeners.next()).dataAlertReceived(dAE);
    }
}
public interface DataAlertListener {
    public void dataAlertReceived(DataAlertEvent event);
}
}  


public class DataAlertEvent extends EventObject {
    public DataAlertEvent(Object source) {
        super(source);
        // TODO Auto-generated constructor stub
    }
}   


Below is the added code after trying to fix

02-06 10:27:30.673: VERBOSE/SmartApp(276): data alert event caught
02-06 10:27:31.013: WARN/System.err(276): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-06 10:27:31.042: WARN/System.err(276):     at android.os.Handler.<init>(Handler.java:121)
02-06 10:27:31.052: WARN/System.err(276):     at android.view.ViewRoot.<init>(ViewRoot.java:231)
02-06 10:27:31.052: WARN/System.err(276):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-06 10:27:31.062: WARN/System.err(276):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-06 10:27:31.082: WARN/System.err(276):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
02-06 10:27:31.082: WARN/System.err(276):     at android.app.Dialog.show(Dialog.java:241)
02-06 10:27:31.102: WARN/System.err(276):     at cpe495.smartapp.SmartApp$4.dataAlertReceived(SmartApp.java:80)
02-06 10:27:31.102: WARN/System.err(276):     at cpe495.smartapp.DataRobot.fireDataAlertEvent(DataRobot.java:96)
02-06 10:27:31.122: WARN/System.err(276):     at cpe495.smartapp.DataRobot.analyzeData(DataRobot.java:32)
02-06 10:27:31.122: WARN/System.err(276):     at cpe495.smartapp.SmartApp$2.dataReceivedReceived(SmartApp.java:66)
02-06 10:27:31.133: WARN/System.err(276):     at cpe495.smartapp.ConnectDevice.fireDataReceivedEvent(ConnectDevice.java:71)
02-06 10:27:31.133: WARN/System.err(276):     at cpe495.smartapp.ConnectDevice.run(ConnectDevice.java:42)
02-06 10:27:31.153: WARN/System.err(276):     at java.lang.Thread.run(Thread.java:1096)   


public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {
    TextView smartConnectionStatus;
    TextView testOutputView;
    Thread cThread;
    private ConnectDevice cD = new ConnectDevice();
    private DataRobot dR = new DataRobot();
    private DataBuilder dB = new DataBuilder();
    private DataSender dS = new DataSender();


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intro);

    final AlertDialog alert = new AlertDialog.Builder(this).create();
    Log.v("SmartApp", "inside sendalert");
    //AlertDialog alert = new AlertDialog.Builder(this).create();
    Log.v("SmartApp", "after builder1");
    //Vibrator vibrator;
    //vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    //vibrator.vibrate(500);
    alert.setMessage("Testing alert dialog...");
    alert.setCancelable(false);
    alert.setButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            dialog.cancel();
        }
    });
    Log.v("SmartApp", "after builder2");
    //AlertDialog alert = builder.create();
    alert.setTitle("Title");

        cD.addDataReceivedListener(new DataReceivedListener() {
            @Override
            public void dataReceivedReceived(DataReceivedEvent event) {
                // TODO Auto-generated method stub
                dR.analyzeData(event.getData());
            }
        });
        dR.addDataAlertListener(new DataAlertListener() {
            @Override
            public void dataAlertReceived(DataAlertEvent event) {
                Log.v("SmartApp", "data alert event caught");
                sendAlert();
                            alert.show();
            }
        });
    }

}   

解决方案

You must create and show alert dialog in UI thread or:

  1. Create a Handler in UI thread.

    Handler mHandler = new Handler();
    

  2. Create a thread

    class A implements Runnable {
        public void run() {
            // create and show alert here
        }
    }
    

  3. When event is fired, call:

    A a = new A();
    mHandler.post(a);
    

这篇关于alertdialog误差事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆