2013-03-20 33 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的建议。

相关问题