2016-12-27 2 views
1

Selon le document officiel: https://developer.android.com/reference/android/app/ActivityManager.html#setWatchHeapLimit(long)Comment utiliser ActivityManager.setWatchHeapLimit() pour regarder heap_limit

j'ai écrit une démo pour voir si le HEAP_LIMIT serait triggered.But semble que cela ne fonctionnait pas, et est ici mon code.

public class ActivityManagerActivity extends Activity 
{ 

    private String TAG = this.getClass().getName(); 

    private Button btnIncreaseMemory; 
    private BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_activity_manager); 
     registerBroadcast(); 
     registerHeapLimit(); 
     iniComponent(); 
    } 

    private void iniComponent() 
    { 
     btnIncreaseMemory = (Button) findViewById(R.id.btnIncreaseMemory); 
     btnIncreaseMemory.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View view) 
      { 
       Bitmap bitmap = ((BitmapDrawable) getDrawable(R.mipmap.image)).getBitmap(); 
       Log.e(TAG, "bitmap size:" + bitmap.getByteCount()); 
       ((ImageView) findViewById(R.id.ivBitmap)).setImageBitmap(bitmap); 
      } 
     }); 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     activityManager.clearWatchHeapLimit(); 

     if (receiver != null) 
     { 
      unregisterReceiver(receiver); 
      receiver = null; 
     } 
    } 

    private void registerHeapLimit() 
    { 
     ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     activityManager.setWatchHeapLimit(2); 
    } 

    private void registerBroadcast() 
    { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("ACTION_REPORT_HEAP_LIMIT"); 
     receiver = new BroadcastReceiver() 
     { 
      @Override 
      public void onReceive(Context context, Intent intent) 
      { 
       // not be called 
       Toast.makeText(ActivityManagerActivity.this, "get msg", Toast.LENGTH_SHORT).show(); 
      } 
     }; 
     registerReceiver(receiver, filter); 
    } 
} 

je changer le code:

public class ActivityManagerActivity extends Activity 
{ 

    private String TAG = this.getClass().getName(); 

    private Button btnIncreaseMemory; 
    private BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_activity_manager); 
     registerBroadcast(); 
     registerHeapLimit(); 
     iniComponent(); 
    } 

    int index = 0; 

    private void iniComponent() 
    { 
     btnIncreaseMemory = (Button) findViewById(R.id.btnIncreaseMemory); 
     btnIncreaseMemory.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View view) 
      { 
       if(index == 0) 
       { 
        Bitmap bitmap = ((BitmapDrawable) getDrawable(R.mipmap.img6802)).getBitmap(); 
        Log.e(TAG, "bitmap1 size:" + bitmap.getByteCount()); 
        ((ImageView) findViewById(R.id.ivBitmap)).setImageBitmap(bitmap); 
        index = 1; 
       } 
       else if(index == 1) 
       { 
        Bitmap bitmap = ((BitmapDrawable) getDrawable(R.mipmap.img6803)).getBitmap(); 
        Log.e(TAG, "bitmap2 size:" + bitmap.getByteCount()); 
        ((ImageView) findViewById(R.id.ivBitmap2)).setImageBitmap(bitmap); 
        index = 2; 
       } 
       else if(index == 2) 
       { 
        Bitmap bitmap = ((BitmapDrawable) getDrawable(R.mipmap.img6804)).getBitmap(); 
        Log.e(TAG, "bitmap3 size:" + bitmap.getByteCount()); 
        ((ImageView) findViewById(R.id.ivBitmap3)).setImageBitmap(bitmap); 
        index = 3; 
       } 
      } 
     }); 
    } 

    @Override 
    public void onDestroy() 
    { 
     super.onDestroy(); 
     ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     activityManager.clearWatchHeapLimit(); 

     if (receiver != null) 
     { 
      unregisterReceiver(receiver); 
      receiver = null; 
     } 
    } 

    private void registerHeapLimit() 
    { 
     ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     activityManager.setWatchHeapLimit(157286400);//150MB 
    } 

    private void registerBroadcast() 
    { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("ACTION_REPORT_HEAP_LIMIT"); 
     receiver = new BroadcastReceiver() 
     { 
      @Override 
      public void onReceive(Context context, Intent intent) 
      { 
       // not be called 
       Toast.makeText(ActivityManagerActivity.this, "get msg", Toast.LENGTH_SHORT).show(); 
      } 
     }; 
     registerReceiver(receiver, filter); 
    } 
} 

Mais toujours pas en avertit, même le tas utilisé a adopté la 150MB limite que je mets.

+0

avez-vous construit votre apk en mode débogage? –

+0

@HasifSeyd Salut, je ne suis pas sûr, mais je pense que le mode par défaut peut être le mode de débogage. Parce que j'utilise AS, et android: debuggable = "true" n'est pas nécessaire dans manifest.xml. – MichaelYe

Répondre

0

Augmentez la limite pss à une valeur raisonnable que sera franchie en cliquant sur le bouton.

La valeur que vous avez fournie (2k) est trop petite, et je crois que votre activité croise cette valeur avant même que vous ne cliquiez sur le bouton.

+0

J'ai essayé, mais je ne travaille toujours pas. Merci quand même. – MichaelYe