2013-10-21 19 views
0

我有一個應用程序實現了可運行。所述可運行每2.5秒運行一次。在可運行的內部,我製作了一個開關,用於以不同密度運行可運行的指令(可運行圖像在屏幕上移動圖像,顯然,對於xhdpi設備,它們需要移動與mdpi設備不同的參數)。我的問題是,爲每個解決方案列出不同的runnable會更有效率嗎?運行前可運行的密度是否可以通過每種情況?這似乎會消耗大量的資源。感謝您的任何見解。一些代碼貼在下面:支持多個設備時優化性能

final Handler handler = new Handler(); 
      final Runnable r = new Runnable() { 
       public void run() { 

      RelativeLayout.LayoutParams params = new  
LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      RelativeLayout.LayoutParams params2 = new 
LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      RelativeLayout.LayoutParams params3 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

      DisplayMetrics metrics = new DisplayMetrics(); 
      getWindowManager().getDefaultDisplay().getMetrics(metrics); 
      switch(metrics.densityDpi){ 
       case DisplayMetrics.DENSITY_LOW: 
        params.topMargin = (int)(Math.random()*704 + 1); 
        params.leftMargin = (int)(Math.random()*1334 + 1); 
        params2.topMargin = (int)(Math.random()*704 + 1); 
        params2.leftMargin = (int)(Math.random()*1334 + 1); 
        params3.topMargin = (int)(Math.random()*704 + 1); 
        params3.leftMargin = (int)(Math.random()*1334 + 1); 
        MapView.loadUrl("file:///android_asset/ldpimap.html"); 
         break; 
       case DisplayMetrics.DENSITY_MEDIUM: 
        params.topMargin = (int)(Math.random()*1299 + 1); 
        params.leftMargin = (int)(Math.random()*2419 + 1); 
        params2.topMargin = (int)(Math.random()*1299 + 1); 
        params2.leftMargin = (int)(Math.random()*2419 + 1); 
        params3.topMargin = (int)(Math.random()*1299 + 1); 
        params3.leftMargin = (int)(Math.random()*2419 + 1); 
        MapView.loadUrl("file:///android_asset/mdpimap.html"); 
          break; 
       case DisplayMetrics.DENSITY_HIGH: 
        params.topMargin = (int)(Math.random()*3039 + 1); 
        params.leftMargin = (int)(Math.random()*5559 + 1); 
        params2.topMargin = (int)(Math.random()*3039 + 1); 
        params2.leftMargin = (int)(Math.random()*5559 + 1); 
        params3.topMargin = (int)(Math.random()*3039 + 1); 
        params3.leftMargin = (int)(Math.random()*5559 + 1); 
        MapView.loadUrl("file:///android_asset/hdpimap.html"); 
          break; 
       case DisplayMetrics.DENSITY_XHIGH: 
        params.topMargin = (int)(Math.random()*5489 + 1); 
        params.leftMargin = (int)(Math.random()*9969 + 1); 
        params2.topMargin = (int)(Math.random()*5489 + 1); 
        params2.leftMargin = (int)(Math.random()*9969 + 1); 
        params3.topMargin = (int)(Math.random()*5489 + 1); 
        params3.leftMargin = (int)(Math.random()*9969 + 1); 
        MapView.loadUrl("file:///android_asset/xhdpimap.html"); 
          break; 
       case DisplayMetrics.DENSITY_XXHIGH: 
        params.topMargin = (int)(Math.random()*8649 + 1); 
        params.leftMargin = (int)(Math.random()*14749 + 1); 
        params2.topMargin = (int)(Math.random()*8649 + 1); 
        params2.leftMargin = (int)(Math.random()*14749 + 1); 
        params3.topMargin = (int)(Math.random()*8649 + 1); 
        params3.leftMargin = (int)(Math.random()*14749 + 1); 
        MapView.loadUrl("file:///android_asset/xxhdpimap.html"); 
      } 

      fImage.setLayoutParams(params); 
      fImage2.setLayoutParams(params2); 
      fImage3.setLayoutParams(params3); 

      handler.postDelayed(this, 2350); 

       } 
    }; 
    r.run(); 
+1

1.不要優化,直到你需要。 2.爲什麼不直接使用調試器來查看哪條路徑被採用? 3.你爲什麼不測量不同的方法? – Simon

+0

我同意西蒙。嘗試使用android的traceview工具來衡量不同方法之間的表現。 – DroidT

回答

0

會是更有效地列出每一項決議,而不是不同的可運行。

有一個可以忽略的差異。在理論上切換/如果循環內部較慢。由於決議永遠不會改變它的成本可能每次迭代1個週期。循環至少需要幾千個週期,所以忘記它。

在運行之前,可運行的密度是否經過了每種情況?

不,爲什麼?

更重要的是乾淨的代碼。您可以使用表格替換開關。

+0

我對android開發有點新。當你提到使用表而不是交換機時,你究竟提到了什麼?清理這麼少的代碼是否會產生更好的性能?因爲我的手機已經開始滯後,不是很嚴重,但是在實現這個開關時顯然。 –

+0

表格不會變得更快。在你的交換機中,我看不出有什麼問題。你是因爲它嗎?嘗試在實驗中註釋掉你不需要的分支,也可以註釋掉開關本身,但是我強烈懷疑,任何改變。 – maaartinus