2017-09-25 50 views
0

當我加載靜態C++庫時,我的UI線程被阻塞。 我想創建一個旋轉加載欄,所以用戶不會認爲App被凍結。但是由於這個庫加載,我的酒吧不旋轉(需要5秒鐘)。是否有可能加載庫在靜態塊,而不是更新用戶界面?在Android中加載靜態C++庫時阻塞UI

public class LoadingActivity extends AppCompatActivity { 


    /** 
    * Load native libraries 
    */ 

    static { 
     System.loadLibrary("native-lib"); 
     if (BuildConfig.DEBUG) { 
      OpenCVLoader.initDebug(); 
     } 
    } 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent returnIntent = new Intent(); 
     returnIntent.putExtra("result", Activity.RESULT_OK); 
     setResult(Activity.RESULT_OK, returnIntent); 
     finish(); 
    } 
} 
+0

您應該將您的「native-lib」加載到非主線程中。 –

回答

1

這應做到:

static { 
    new Thread(() -> {   
    System.loadLibrary("native-lib"); 
    if (BuildConfig.DEBUG) { 
     OpenCVLoader.initDebug(); 
    } 
    }).start(); 
} 

但是你要關心等到庫被加載並使用它之前初始化。

+0

這是一個很好很容易修復的問題。但即使如此,直接從一個Activity使用一個沉重的本地庫也不是一個好主意。將** native-lib **包裝到不受Android生命週期管理的獨立Java類中更安全。 –

+0

對 - 這不是一個非常「乾淨」的解決方案。但說實話,我真的不明白如何使用單獨的類會改善運行時行爲。你能解釋一下嗎? – ospf

+0

可以以更受控制的方式加載單獨的類。對於活動,這完全是系統的責任。你不知道什麼時候Android會實例化它。特別是對於OP提供的示例,** ** ** ** ** **的唯一目的是加載本地庫。巨大的開銷(內存,資源,維護)是不合理的。 –