2014-02-12 3 views
-5

Я знаю его кое-что, что я должен просто google, но, возможно, вы, ребята, можете меня когда-нибудь спасти.Android - Недостаточно памяти

Я попытался запустить процесс регистрации в своем приложении для Android и после некоторого времени получил освобождение из памяти.

Я пытаюсь понять, почему это произошло?

class LongOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     int factor = 59; 
     int factorSuperNum = 35; 
     int num; 
     List<Integer> alreadyIn = new ArrayList<Integer>(); 
     StringBuilder sb = new StringBuilder(); 
     for (int j=0; j<5000000; j++){ 
     alreadyIn.clear(); 
     for(int i=0;i<5;i++){ 
       num = (int) (1 + (Math.random() * factor) % factor); 
       while (alreadyIn.contains(num)) 
        num = (int) (1 + (Math.random() * factor) % factor); 

       alreadyIn.add(num); 
     } 
     if(j % 100000 == 0) 
      Log.i("SendEmail", j + ""); 

     num = (int) (1 + (Math.random() * factorSuperNum) % factorSuperNum); 
     alreadyIn.add(num); 

     for (int finalNum : alreadyIn) { 
      sb.append(finalNum + " "); 
     } 
     sb.append("\n"); 
    } 
     return null; 
    } 
} 

ответ

1

этот код плох в очень многих случаях ...

первого (Math.random() * factor) % factor почему вы умножая случайным образом фактора? Знаете ли вы, что random % x плохой?

второго OOME потому, что вы добавляете строку StringBuilder в каждой итерации поэтому после оЙ итерации требуется, по крайней мере 10Mb (5M * 20-40bytes)

thrid для принятия 5 из фактора можно использовать ArrayList с диапазоном от 1 для его формования и перетасовки и получения первых 5-х элюсов:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class LOLOLOLOLOL 
{ 
    static final int F = 59; 
    static final int FSN = 35; 
    static final ArrayList<Integer> range1toF = new ArrayList<Integer>(); 
    static final Random rnd = new Random(); 
    static{ 
     for(int i = 1; i < F; i++) 
      range1toF.add(i); 
    } 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     final PrintStream ps = new PrintStream(System.out); //or from File 
     for(int i = 0; i < 20; i++){ 
      Collections.shuffle(range1toF, rnd); 
      for(int j = 0; j< 5; j++){ 
       ps.print(range1toF.get(j)); 
       ps.print(", "); 
      } 
      ps.println(rnd.nextInt(FSN - 1) + 1); 
     } 
    } 
} 
Смежные вопросы