Android Spracherkennung Aktivität in ‚onCreate‘ Methode aufgerufen verursacht App Last langsam

StackOverflow https://stackoverflow.com/questions/3841381

Frage

In meiner android app nenne ich die Spracherkennung in meiner onCreate Methode meiner Startaktivität. Ich habe es eine Präferenz starten mit der Sprachsteuerung gemacht oder nicht. Allerdings dauert die App etwa 5-7 Sekunden zu laden, wenn die Spracherkennung aktiviert ist. Wenn er ausgeschaltet ist, startet die App fast sofort. Im Folgenden Beispielcode ist, habe ich Free_Form, max_results 1, und eine benutzerdefinierte Abfrage zu mir.

hinzugefügt
Intent intent = new Intent("android.speech.action.RECOGNIZE_SPEECH");  
startActivityForResult(intent, 0);

Also wirklich, ich habe 2 Fragen:

Ist das nicht der startActivity (Absicht) läuft in einem separaten Thread?

Warum die normale Android-Spracherkennung nimmt sooo lange Last in meiner OnCreate Methode würde nennen?

War es hilfreich?

Lösung

Sie wahrscheinlich warten Sie nicht, diesen Prozess von onCreate zu vervollständigen, es stattdessen starten, so dass das Ergebnis auf einen Callback-Handler wird wieder kommen, oder einen Thread machen und starten Sie es von dort.

Andere Tipps

Das Setup für die Spracherkennung nicht 5-7 Sekunden auf meinem Motorola Droid nehmen, ist es <0,5 s, so dass Sie ein anderes Problem haben mit Ihrem Code. None-the-less, hier ist der Code die Herstellung von onCreate zu einem Hintergrund-Thread für die Bewegung:

public class VoiceRecognition extends Activity implements OnClickListener {

private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
ImageButton speechButton;
static List<ResolveInfo> systemActivities=null;
private ListView mList;

/**
 * Called with the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Inflate our UI from its XML layout description.
    setContentView(R.layout.voice_recognition);

    // Get display items for later interaction
    speechButton = (ImageButton) findViewById(R.id.btn_speak);
    mList = (ListView) findViewById(android.R.id.list);
    // Asynchronously activate speech recognition
    new getSpeechTask().execute();
}
private class getSpeechTask extends AsyncTask<Void,Void,List<ResolveInfo>>{
    protected List<ResolveInfo> doInBackground(Void...params) {
        List<ResolveInfo> sysAct=null;
        if(sysAct==null){
            PackageManager pm = getPackageManager();
            sysAct = pm.queryIntentActivities(
                    new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0
            );
        }
        return sysAct;
    }//doInBackground
    protected void onPostExecute(List<ResolveInfo> result) {
        systemActivities=result;    
        setSpeechStatus();
    }//apply result
}//getSpeechTask    
void setSpeechStatus(){
    if(systemActivities.size()>0){
        speechButton.setOnClickListener(
            new OnClickListener(){
                @Override
                public void onClick(View v) {
                    startVoiceRecognitionActivity();
                }
            }
        );
        speechButton.setEnabled(true);  
    }else{
        speechButton.setEnabled(false); 
    }
}
void startVoiceRecognitionActivity(){
    if(systemActivities==null){
        PackageManager pm = getPackageManager();
        systemActivities = pm.queryIntentActivities(
                new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
        setSpeechStatus();
    }
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Missive(c) Speech Input");
    startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}

/**
 * Handle the click on the start recognition button.
 */
public void onClick(View v) {
    if (v.getId() == R.id.btn_speak) {
        startVoiceRecognitionActivity();
    }
}


/**
 * Handle the results from the recognition activity.
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
        // Fill the list view with the strings the recognizer thought it could have heard
        ArrayList<String> matches = data.getStringArrayListExtra(
                RecognizerIntent.EXTRA_RESULTS);
        mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
                matches));
    }

    super.onActivityResult(requestCode, resultCode, data);
}
}

mit layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
    />
   <ImageButton android:id="@+id/btn_speak"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@android:drawable/ic_btn_speak_now"
   />
</LinearLayout>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top