2016-12-05 98 views
0

我有三個功能在我Main類,onCreateonClickclick,我有兩個選擇,申報TextViews,並在項目作爲全局變量,這意味着他們將留下的開頭有一些其他的看法在整個應用程序生命週期中,或者在每個函數中分別獲取它們(將導致計算機工作更多,但變量不會一直保留在內存中)。爲了說明這個問題進一步:設置意見Android的全局變量

選項1:

public static final int L = 6; 
TextView[] textViews = new TextView[L]; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Random rand = new Random(); 
    int[] digits = {rand.nextInt(10), rand.nextInt(10), rand.nextInt(10), rand.nextInt(10), rand.nextInt(10), rand.nextInt(10)}; 
    for (int i = 0; i < L; i++) { 
     textViews[i] = (TextView) findViewById(getResources().getIdentifier("num" + String.valueOf(i), "id", getPackageName())); 
     textViews[i].setOnClickListener(this); 
     textViews[i].setText(String.valueOf(digits[i])); 
    } 
} 

@Override 
    public void onClick(View view) { 
     int id = view.getId(); 
     switch (id) { 
      case R.id.num0: 
       click(0); 
       break; 
      case R.id.num1: 
       click(1); 
       break; 
      case R.id.num2: 
       click(2); 
       break; 
      case R.id.num3: 
       click(3); 
       break; 
      case R.id.num4: 
       click(4); 
       break; 
      case R.id.num5: 
       click(5); 
       break; 
     } 
    } 


public void click(int clicked) { 
     textViews[clicked].setText("Clicked");  
} 

選項2:(請注意,以縮短時間 - 變化是在最後一個函數)。

public static final int L = 6; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Random rand = new Random(); 
    int[] digits = {rand.nextInt(10), rand.nextInt(10), rand.nextInt(10), rand.nextInt(10), rand.nextInt(10), rand.nextInt(10)}; 
    for (int i = 0; i < L; i++) { 
     textViews[i] = (TextView) findViewById(getResources().getIdentifier("num" + String.valueOf(i), "id", getPackageName())); 
     textViews[i].setOnClickListener(this); 
     textViews[i].setText(String.valueOf(digits[i])); 
    } 
} 

@Override 
    public void onClick(View view) { 
     int id = view.getId(); 
     switch (id) { 
      case R.id.num0: 
       click(0); 
       break; 
      case R.id.num1: 
       click(1); 
       break; 
      case R.id.num2: 
       click(2); 
       break; 
      case R.id.num3: 
       click(3); 
       break; 
      case R.id.num4: 
       click(4); 
       break; 
      case R.id.num5: 
       click(5); 
       break; 
     } 
    } 


public void click(int clicked) { 
     ((TextView) findViewById(getResources().getIdentifier("num" + String.valueOf(clicked),"id",getPackageName())).setText("Clicked");  
} 

請考慮到我有超過TextView陣列多,而且在某些功能我要再次獲得5次,這將是更好地將它們聲明爲全局變量?我在大部分時間使用全局變量讀取某處並不好,這與功能的整個想法是背道而馳的,但在這裏似乎更簡單..對不起我的英語,謝謝大家。

回答

1

首先,如果全局聲明瞭對象textViews,則不必擔心性能問題。它是微不足道的。

現在在你的代碼中,如果聲明textViews數組對象的唯一理由是在click()方法中引用它,那麼就沒有必要在全局聲明它。

相反,您可以將覆蓋的onClick()方法提供的視圖對象傳遞給您的方法click()

@Override 
    public void onClick(View view) { 
     int id = view.getId(); 
     switch (id) { 
      case R.id.num0: 
       click(view); 
       break; 
      case R.id.num1: 
       click(view); 
       break; 
      case R.id.num2: 
       click(view); 
       break; 
      case R.id.num3: 
       click(view); 
       break; 
      case R.id.num4: 
       click(view); 
       break; 
      case R.id.num5: 
       click(view); 
       break; 
     } 
    } 


public void click(View viewClicked) { 
     ((TextView))viewClicked.setText("Clicked") 
} 
+1

我實際上使用它,因爲你說,我只是改變了代碼,以適應這個問題:)所以我可以聲明全局的東西,不擔心表現?很棒:) – DAVIDBALAS1