2013-03-20 41 views
0

我正在製作一個android應用程序。應用程序中有一項活動,觸發時會生成一個稀疏陣列並填充數據。現在這個過程需要花費1分鐘時間,這非常長。所以我想在應用程序啓動時進行一次sparsearray,並在應用程序的整個生命週期內將sparsearray保存在RAM中。而且無論何時觸發活動,它都應該訪問RAM中的稀疏陣列而不是創建一個新的陣列,從而節省時間和處理能力。這可以做到,如果是的話,怎麼樣?對不起,如果這個問題是愚蠢的,我是新來的android。謝謝! *編輯:這是什麼使功能sparsearray樣子: //函數訪問sparsearray決策功能如何在應用程序啓動時製作(並保存在RAM中)sparsearray? (android)

public String[] process(){ 
InputStream is = context.getAssets().open("feedtitlesandaddresses.txt"); 
     InputStreamReader iz=new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(iz); 
     String line = null; 
while((line=br.readLine())!=null) { 

      readLine(line); 

      }} 
//sparsearray making function 
private void readLine(String line) { 
//some string processing(omitted here) 
int num1 = Integer.parseInt(firstNumber); 

     //int num2 = Integer.parseInt(secondNumber); 
     if(sparseArray.get(num1) == null) { 

      sparseArray.put(num1, new SparseArray<String>()); 

     } 
     temporarySparseArray = sparseArray.get(num1); 

     for(int w=0;w<size;w++){ 
     temporarySparseArray.put(w, array1[w]); 
       } 
     sparseArray.put(num1, temporarySparseArray); 

     temporarySparseArray = null; 
} 
+0

請問你能提供一些代碼嗎?如果你的AVD只有一些MHz,它會很慢。 – staaar 2013-03-20 06:51:45

+0

@staaar我怎樣才能知道我的AVD有多少MHz? – 2013-03-20 06:52:59

+0

@staaar哪部分代碼? – 2013-03-20 06:53:07

回答

0

你可以寫你在Android內部或外部的文件系統對象,你可以閱讀對象當你想使用它。

+0

你會建議使用哪種方式讀寫文件系統中的對象,以及它們的性能如何取決於對象的大小?如果原始數據發生變化,會有什麼影響? – 2013-03-20 07:26:49

0

我覺得這個問題應該有自己的答案,我相信有人會拿出一個,但是,嗯,不是真的爲止;如果我是Tom Wong,那麼現在我會認爲,就好像StackOverflow是一個想讓專家開始爭論而不是回答問題的地方一樣。 ;)所以我們走了。

  • 做一些事情,在啓動時,結果是隻要你的應用程序在內存中持續:這樣做的正確的地方是Application.onCreate(),而您需要繼承Application。這是好的結果存儲在該Application對象,以及在這種情況下,您可以從任何Activity通過獲取應用程序上下文訪問它。

  • 做一些事情需要一些時間:一般來說,在Android上使用AsyncTask是個好主意,但它專門用於處理與用戶界面相關但不能阻止的事情。另外,沒有一些明確的調整,其行爲在不同的Android版本中會有所不同。目前,如果沒有進一步的措施,如果你通過AsyncTask進行了計算,其他的AsyncTasks將不得不先等待。此外,你想做的事是不是使用的AsyncTask經典的任務,所以使用它只是最後存儲其結果在volatile參考一次性線程。

下面的代碼段應該給你的想法。

final class MyApplication extends Application { 
    public volatile String[] expensiveToCompute; 
    @Override 
    public void onCreate() { 
     expensiveToCreate = null; 
     (new Thread() { 
      @Override 
      public void run() { 
       String[] result = computeMyData(); 
       // it is important to assign the locally created data at once here 
       expensiveToCompute = result; 
      } 
     }).start(); 
    } 
} 

這樣,expensiveToComputenull直到異步計算已完成。

瞭解,這個線程將運行至完成是非常重要的,而且它擁有你MyApplication對象的引用。這意味着即使用戶離開你的應用程序,如果你的應用程序尚未完成,它仍然會繼續。

這其實是不錯的,因爲無論安卓決定離開你的應用程序對象還活着,只是因爲它可以,在這種情況下,用戶體驗得到改善。或者Android使用Application對象,線程和任何保存的數據來殺死整個進程,在這種情況下,它將在下次從頭開始。一下,嗯,建議

還有一點需要昂貴的計算遷入AsyncTask等:安卓指定一個默認背景優先考慮這樣的思路,和所有的後臺線程會(目前)有10%的CPU時間住乾脆不管是否Android系統空閒,否則。很多將密集型計算轉移到後臺任務的人都會注意到它會花費十倍的時間。因此,您可能需要閱讀我對如何處理此here和/或here的建議。

相關問題