Android 而运行中的循环停止执行

Android 而运行中的循环停止执行,android,Android,我的程序在活动运行代码的While循环中运行。它大约每100毫秒读取一次USB数据。 当USB数据流中的一个字节被设置时,我称之为startVoiceRecognitionActivity(): 语音识别器运行良好,我的USB数据流While loop在语音识别器运行时保持运行 但是,在onActivityResult执行后,我的While循环终止。我需要留在这个while循环中,我怎么能做到 编辑:我一直在调试这个,并将显示相关的当前代码。似乎onActivityReturn在程序崩溃之前以某

我的程序在活动运行代码的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()后自动调用的):

@覆盖
恢复时公开作废(){
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>