Android 而运行中的循环停止执行
我的程序在活动运行代码的While循环中运行。它大约每100毫秒读取一次USB数据。 当USB数据流中的一个字节被设置时,我称之为startVoiceRecognitionActivity(): 语音识别器运行良好,我的USB数据流While loop在语音识别器运行时保持运行 但是,在onActivityResult执行后,我的While循环终止。我需要留在这个while循环中,我怎么能做到 编辑:我一直在调试这个,并将显示相关的当前代码。似乎onActivityReturn在程序崩溃之前以某种方式中断了USB。我编辑了我的while循环,以显示在语音识别器呼叫后我如何尝试重新建立USB 显示代码时,在运行调试的语音识别器调用后,代码会在没有断点的情况下中断。如果我从那里继续执行代码,程序就会停止,就像我单击了Terminate按钮一样。这是我的计算机屏幕,当执行自行中断时,它似乎是一个NullPointerException问题,这仍然超出了我的知识库。希望有人能给我指出正确的方向 我开始相信你在下图中看到的线程[Thread-130](正在运行)就是罪魁祸首。此线程在从语音识别器呼叫返回时显示。我在想,我需要确保在语音识别器呼叫后执行返回到原始线程,但我可能离这里很远 或者更好的是(也许),有没有一种方法可以在我调用语音识别器时终止原始线程 哇,就是这样,或者至少我认为是这样,我所需要做的就是打破;启动语音识别器后,退出while循环(如果usb请求失败,我还必须退出while循环) 而且,我不必在runOnUiThread()中启动语音识别器 我认为这很有魅力,但我注意到挂起的线程不断累积,最终程序停止执行语音识别器。我相信我会追查到这一点,但任何智慧的话语都会有所帮助 抱歉这么多细节,但我将把整个初学者的思考过程留给后面的人(除非你开始否决这个) 顺便说一句,这是一个多么神奇的调试环境 似乎挂起的线程是在我调试时创建的,我还没有弄清楚为什么它会停止工作,但很可能是所有挂起的线程。我会弄明白的。我还没有能够复制这个问题,我想我真的已经找到了答案(如上),但我会等待一段时间,然后张贴这个作为答案,只是为了确保 美国东部时间1月21日11:14:仍有2期 -大约十分之一的语音识别调用会导致执行onResume(),但run()不会在onResume()之后执行(另外9次run()是在onResume()之后输入的)。这会导致我的程序挂断,因为没有进入while循环 -每当用户使用系统的“返回”箭头使用另一个程序,然后返回到我的程序时,就会出现另一个线程(具有自己的while循环)。实际上,这会创建我的程序的多个实例,这是不可接受的 而且,我又重新启动了RunNuithRead()中的语音识别器,我想这会减少挂断的次数 美国东部时间1月21日下午1:27: 再说一次,我想我已经成功了。我已经打了100次语音识别电话,断断续续地使用了其他程序,在调试窗口中仍有相同数量的运行线程,而且它没有挂断 我所做的是,声明一个活动级别的整数exitloopnow。我在onCreate、onStart和onResume中将exitloopnow设置为0。我在onPause、onStop和onDestroy中将exitloopnow设置为1。在run()while循环中,如果exitloopnow==1,则中断 再说一次,如果这继续有效,我会把它作为答案,除非有人想出更好的答案 美国东部时间1月21日下午2:00: 我想100次是不够的。我发现它在调试模式下挂断了。它似乎卡在下面的.resquestWait()上 我找不到太多关于“不可用[本机方法]”的信息,所以我再次陷入困境。如果我继续执行代码并再次中断,代码总是在他的行上(350) 美国东部时间1月22日上午9:20: 当代码挂起在第350行时,我可以拔下USB电缆,然后将其插回,这确实会创建另一个工作线程,但这是不可取的。我也可以使用Androids后退按钮,通过在最近的应用程序中选择该程序来获得另一个线程,这也不可取 以下是onActivityResult(): 以及我尝试重新建立USB的代码(在onResume代码中,因为onResume是在语音识别onActivityResult()后自动调用的):Android 而运行中的循环停止执行,android,Android,我的程序在活动运行代码的While循环中运行。它大约每100毫秒读取一次USB数据。 当USB数据流中的一个字节被设置时,我称之为startVoiceRecognitionActivity(): 语音识别器运行良好,我的USB数据流While loop在语音识别器运行时保持运行 但是,在onActivityResult执行后,我的While循环终止。我需要留在这个while循环中,我怎么能做到 编辑:我一直在调试这个,并将显示相关的当前代码。似乎onActivityReturn在程序崩溃之前以某
@覆盖
恢复时公开作废(){
super.onResume();
Intent=getIntent();
日志d(标签“意图:”+意图);
保存文件(“1意图:+意图);
连接b();
}
私有void connectToUsb(){
如果(amconnected==1){
mConnection.close();
request.close();
}否则{
setupusb();
}
amconnected=0;
while(amconnected==0){
doconnect();
}
初始化(mConnection,mendpointr);
}
私有void setupusb(){
mUsbManager=(UsbManager)getSystemService(Context.USB_服务);
mPermissionIntent=PendingIntent.getBroadcast(this,0,新意图(ACTION\u USB\u权限),0);
IntentFilter筛选器=新建IntentFilter(操作\u USB\u权限);
寄存器接收器(mUsbReceiver,过滤器);
}
私有void doconnect(){
HashMap deviceList=mUsbManager.getDeviceList();
迭代器deviceIterator=deviceList.values().Iterator();
while(deviceIterator.hasNext()){
UsbDevice device1=deviceIterator.next();
if(device1.getVendorId()=1240和device1.getProductId()=63){
private void startVoiceRecognitionActivity() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Voice recognition Demo...");
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK)
{
// Populate the wordsList with the String values the recognition engine thought it heard
final ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.tvTitle)).setText(matches.get(0));
}
});
BusyV=0;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void run() {
while (true) {
request.queue(buffer, 64);
if (mConnection.requestWait() == request) {
if (buffer.get(7)==0) { //New Box (Yellow) button pressed now
this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.tvSpine)).setText("Spine");
((TextView) findViewById(R.id.tvPage)).setText("Page");
((TextView) findViewById(R.id.tvThick)).setText("Thick");
}
});
if (CanRecog==1) {
if (BusyV!=1) {
BusyV=1;
this.runOnUiThread(new Runnable() {
public void run() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Voice recognition ...");
startActivityForResult(intent, REQUEST_CODE);
}
});
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
} else {
this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.tvZnum)).setText("USB lost at "+ System.currentTimeMillis());
((TextView) findViewById(R.id.tvXnum)).setText(" ");
}
});
}
}
}
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
savetofile("1 intent: " + intent);
connectToUsb();
}
private void connectToUsb() {
if (amconnected==1) {
mConnection.close();
request.close();
} else {
setupusb();
}
amconnected=0;
while(amconnected==0) {
doconnect();
}
request.initialize(mConnection, mEndpointIntr);
}
private void setupusb() {
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
}
private void doconnect() {
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device1 = deviceIterator.next();
if (device1.getVendorId() == 1240 & device1.getProductId() == 63) {
mUsbManager.requestPermission(device1, mPermissionIntent);
setDevice(device1);
}
}
}
private void setDevice(UsbDevice device) {
Log.d(TAG, "setDevice " + device);
savetofile("2 setDevice " + device);
if (device.getInterfaceCount() != 1) {
Log.e(TAG, "could not find interface");
savetofile("3 could not find interface");
return;
}
UsbInterface intf = device.getInterface(0);
UsbEndpoint ep = intf.getEndpoint(0);
if (ep.getType() != UsbConstants.USB_ENDPOINT_XFER_INT) {
Log.e(TAG, "endpoint is not interrupt type");
savetofile("5 endpoint is not interrupt type");
return;
}
mEndpointIntr = ep;
if (device != null) {
UsbDeviceConnection connection = mUsbManager.openDevice(device);
if (connection != null && connection.claimInterface(intf, true)) {
Log.d(TAG, "open SUCCESS");
savetofile("6 open SUCCESS");
mConnection = connection;
Thread thread = new Thread(this);
thread.start();
amconnected=1;
} else {
Log.d(TAG, "open FAIL");
savetofile("7 open FAIL");
mConnection = null;
}
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="act.ProMeasure2D">
<uses-feature android:name="android.hardware.usb.host" />
<uses-sdk android:minSdkVersion="13" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:theme="@android:style/Theme.Black" android:label="ProMeasure2D">
<activity android:name="act.ProMeasure2D.ProMeasure2DActivity"
android:label="ProMeasure2D">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>