首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件的警报对话框错误

事件的警报对话框错误
EN

Stack Overflow用户
提问于 2011-02-06 04:58:56
回答 3查看 755关注 0票数 1

编辑:向我所做的代码添加了一个额外的错误和修改。

我对java/android很陌生。当在我的AlertDialog类中触发一个事件时,我试图在SmartApp类中创建一个DataRobot。我在做这件事时遇到了一个错误。该事件正在SmartApp中触发并成功调用该函数,但当它到达AlertDialog alert = new AlertDialog.Builder(this).create();时,下面的错误将打印到logcat中。有没有人知道我做错了什么,或者有更好的方法来实现我想要的?

代码语言:javascript
复制
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)   

代码语言:javascript
复制
//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");
    }

}   

代码语言:javascript
复制
// 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);
}
}  

代码语言:javascript
复制
public class DataAlertEvent extends EventObject {
    public DataAlertEvent(Object source) {
        super(source);
        // TODO Auto-generated constructor stub
    }
}   

下面的是在试图修复之后添加的代码

代码语言:javascript
复制
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)   

代码语言:javascript
复制
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();
            }
        });
    }

}   
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-06 11:21:29

必须在UI线程中创建和显示警报对话框,或者:

  1. 在UI线程中创建一个处理程序。

处理程序mHandler =新的线程mHandler

类A实现Runnable { public void (){ // create并在这里显示警报}}

  • ,当事件被触发时,调用:

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

票数 1
EN

Stack Overflow用户

发布于 2011-02-06 05:58:08

AlertDialog.Builder(this).create();应该从UI Thread.Try调用,将create()方法移动到Thread.Try。

票数 0
EN

Stack Overflow用户

发布于 2014-08-05 19:28:39

这就是我得到的同样的错误,谢谢你建议把它放在UI线程上。不过,我在Xamarin工作,解决方案实际上是把它放在主线程上,如下所示:

代码语言:javascript
复制
        Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
        {
            page.DisplayAlert("Alert", message, null, "Cancel");
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4911686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档