2017-06-19 9 views
0

私はGoogle Tangoアプリケーションで作業していますが、TangoApplicationクラスを使用してエリアの説明を保存しようとしています。保存エリア説明Onアプリケーションの一時停止

私は現在OnApplicationPause()イベントで呼び出され、以下の機能を持っている

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(); 
    } 
} 

これは、アプリケーションの一時停止機能の間に呼び出されるが、それは私がADFを保存することはできません。アプリがまだ動作している間にこの関数を呼び出すと、保存されます。

誰かが何が起こっている可能性があるのか​​(私はバックグラウンドされたプロセスに問題があると仮定しています)、あなたの借金は永遠に残っています。

答えて

0

それは保存しないで、なぜそれを2つの理由があります。

.ExceptionはUnityがスローされますが。あなたがそうしようとした場合

タンゴAreaDescriptionまたはSaveProductLocationsToDisk APIは、任意のユニティAPIを使用している場合は、別のスレッドや例外でユニティAPIを使用can'tので、その後、それが問題だがスローされます。これが問題である場合は、try catchブロック内の保存コードを置くことによって確認することができます

はその後AndroidのメーカーAndroidのモニタから結果を表示します。

ソリューションは、それが保存行われる前にアプリが終了しているので.ITは保存しないです

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(); 
    } 
} 

メインThread

で実行 Threadコードを削除し、コードを保存することを確認することです。

解決策は、コードの最後にm_saveThread.Join();を追加して、Unityがそのコードが存在する前に実行されるのを待つようにすることです。

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(); 
    } 
} 

か、再度、Threadコードを削除し、私たちは#1に行ったように、メインThreadで実行されるコードを保存してください。

1

実際には、一時停止時の機能がそれを保存する前に、タンゴのライフサイクルがすべてのタンゴリソースを一時停止またはアンロードしていたためです。現時点でバックグラウンドに入るときに、その領域を保存する関数を呼び出す実際の方法はありません。私はGoogleエンジニアにも連絡を取り、現在はTangoの仕組みではサポートされていないため、多大な "Do not Do That"を受け取りました。

SDKでテスト済み:Hopak

関連する問題