2017-06-19 3 views
0

Ich arbeite an einer Google Tango-Anwendung und ich habe versucht, eine Gebietsbeschreibung mit der TangoApplication Klasse zu speichern.Speichern Bereich Beschreibung On Pause der App

Im Moment habe ich die folgende Funktion auf das Ereignis OnApplicationPause() genannt

private void DoSaveCurrentAreaDescription(bool forceLearningMode) 
{ 
    // Disable interaction before saving. 
    m_initialized = false; 
    if (m_tangoApplication.m_areaDescriptionLearningMode) 
    { 
     // The keyboard is not readable if you are not in the Unity main thread. Cache the value here. 
     string name = "config"; 
     // Start saving process in another thread. 

     m_saveThread = new Thread(delegate() 
     { 
      // Start saving process in another thread. 

      m_curAreaDescription = AreaDescription.SaveCurrent(); 
      AreaDescription.Metadata metadata = m_curAreaDescription.GetMetadata(); 
      metadata.m_name = name; 
      m_curAreaDescription.SaveMetadata(metadata); 
      m_TangoManager.m_lastKnownAreaDescription = m_curAreaDescription; 
      m_TangoManager.SaveProductLocationsToDisk(); 

     });   

     m_saveThread.Start(); 

    } 
    else 
    { 
     m_TangoManager.SaveProductLocationsToDisk(); 
    } 
} 

Dies wurde während der Anwendung Pause-Funktion aufgerufen wird, aber es erlaubt mir nicht, den ADF zu speichern. Es wird gespeichert, wenn ich diese Funktion anrufe, während die App noch läuft.

Wenn jemand eine Idee hat, was passieren könnte (ich gehe davon aus, dass Probleme mit dem hintergründigen Prozess threading) Ich wäre für immer in Ihrer Schuld.

Antwort

0

Es gibt zwei mögliche Gründe, warum es nicht gespart:

.Exception wird von Unity geworfen.

Wenn der Tango AreaDescription oder SaveProductLocationsToDisk API jede Einheit API verwendet dann, dass das Problem ist, weil Sie Unity-API in einem anderen Thread und Ausnahme ausgelöst werden verwenden can't, wenn Sie, dies zu tun versuchen.

können Sie überprüfen, ob dies das Problem, indem Sie den Code in try catch Block speichern setzen Sie dann das Ergebnis aus Android-Monitor in Android Studio.

Die Lösung ist die Thread Code zu entfernen und sicher, dass der Code ausgeführt wird in der Haupt Thread

private void DoSaveCurrentAreaDescription(bool forceLearningMode) 
{ 
    // Disable interaction before saving. 
    m_initialized = false; 
    if (m_tangoApplication.m_areaDescriptionLearningMode) 
    { 
     //The keyboard is not readable if you are not in the Unity main thread. Cache the value here. 
     string name = "config"; 
     //Start saving process in another thread. 

     m_curAreaDescription = AreaDescription.SaveCurrent(); 
     AreaDescription.Metadata metadata = m_curAreaDescription.GetMetadata(); 
     metadata.m_name = name; 
     m_curAreaDescription.SaveMetadata(metadata); 
     m_TangoManager.m_lastKnownAreaDescription = m_curAreaDescription; 
     m_TangoManager.SaveProductLocationsToDisk(); 
    } 
    else 
    { 
     m_TangoManager.SaveProductLocationsToDisk(); 
    } 
} 

.Es ist nicht sparend speichern, weil die App verlässt, wird vor dem Speichern erfolgt.

Die Lösung besteht darin, am Ende des Codes m_saveThread.Join(); hinzuzufügen, damit Unity darauf wartet, dass dieser Code ausgeführt wird, bevor er existiert.

private void DoSaveCurrentAreaDescription(bool forceLearningMode) 
{ 
    // Disable interaction before saving. 
    m_initialized = false; 
    if (m_tangoApplication.m_areaDescriptionLearningMode) 
    { 
     // The keyboard is not readable if you are not in the Unity main thread. Cache the value here. 
     string name = "config"; 
     // Start saving process in another thread. 

     m_saveThread = new Thread(delegate() 
     { 
      // Start saving process in another thread. 

      m_curAreaDescription = AreaDescription.SaveCurrent(); 
      AreaDescription.Metadata metadata = m_curAreaDescription.GetMetadata(); 
      metadata.m_name = name; 
      m_curAreaDescription.SaveMetadata(metadata); 
      m_TangoManager.m_lastKnownAreaDescription = m_curAreaDescription; 
      m_TangoManager.SaveProductLocationsToDisk(); 

     });   

     m_saveThread.Start(); 
     //Wait for Save to finish before existing from app 
     m_saveThread.Join(); 
    } 
    else 
    { 
     m_TangoManager.SaveProductLocationsToDisk(); 
    } 
} 

oder wieder, entfernen Sie den Thread Code und macht den sicheren Code Sprint im Haupt Thread wie wir in # 1 taten.

1

Es war tatsächlich aufgrund des Tango-Lebenszyklus, alle Tango-Ressourcen anzuhalten und zu entladen, bevor meine Funktion auf Pause eine Chance haben würde, sie zu speichern. Es gibt keine echte Möglichkeit, die Funktion zum Speichern von Bereichsbeschreibungen aufzurufen, wenn Sie gerade in den Hintergrund gehen. Ich habe mich auch an Google-Ingenieure gewandt und ein starkes "Do not Do That" erhalten, weil es momentan nicht in der Art und Weise unterstützt wird, wie Tango funktioniert.

Getestet am SDK: Hopak

Verwandte Themen