我有這個android項目,不能確定它爲什麼吃RAM嗎?請注意,沒有處理只是填寫RAM。我已閱讀Android RAM issues和how to solve,但無法確定要做什麼。我對android和java都很陌生。可能的android內存泄漏
剛剛注意到(在Android監視器 - 內存)我的應用程序只使用4MB的內存。 如果有人試圖運行(請做 - MainActivity是啓動器,MyCanvas只是一個用作View的類),我可以使用高達100(甚至更多)的速度變量,使線程回調在10ms或更頻繁 - 它沒有任何問題。但只要我觸摸並移動垃圾收集器來暫停一切。
MyCanvas.java(用作視圖)
package com.abc.mygraphics;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
import java.util.Random;
import android.os.Handler;
public class MyCanvas extends View {
public static Paint paint;
//public static int n = 5000;
public static int N = 100, particleSize = 3;
public static int height, width;
public static float[][] pos = new float[N][2];
public static float[][] pos0 = new float[N][2];
//public static float distX, distY, dist;
Handler handler = new Handler();
public static int speed = 1;
public static int gravityX, gravityY;
public static Random random = new Random();
public static int[] colorList = new int[10];
public static int sphereSize = 100, M = 10;
public static float[] distance = new float[N];
public static int[][] gravity = new int[N][2];
public static boolean[] direction = new boolean[N];
public static int[] moved = new int[N];
public MyCanvas(Context context) {
super(context);
width = MainActivity.sharedPreferences.getInt("screenX", 200);
height = MainActivity.sharedPreferences.getInt("screenY", 200);
colorList = new int[]{Color.RED, 0xffff4000, 0xffffff00, 0xff40ff00, 0xff00ff00, 0xff00ff80, 0xff0080ff, 0xff0000ff, 0xffbf00ff, 0xffff0040};
paint = new Paint();
paint.setColor(Color.GRAY);
int i;
for (i = 0; i < N; i++) {
pos[i][0] = random.nextInt(width);
pos[i][1] = random.nextInt(height);
pos0[i][0] = pos[i][0];
pos0[i][1] = pos[i][1];
moved[i] = 0;
direction[i] = true;
}
final Runnable r = new Runnable() {
public void run() {
invalidate();
handler.postDelayed(this, 100);
}
};
handler.postDelayed(r, 100);
}
public static void changeGravity(){
gravityX = MainActivity.sharedPreferences.getInt("x",200);
gravityY = MainActivity.sharedPreferences.getInt("y",200);
// gravityY -= 68;
for(int i=0;i<N;i++){
calcDist(i);
}
}
@Override
public void onDraw(Canvas canvas){
int i;
int x; //remove at some poitnt
canvas.drawColor(Color.BLACK);
//canvas.drawCircle(gravityX,gravityY, 50, paint);
for(i=0;i<N;i++) {
setPosition(i);
x = random.nextInt(10);
paint.setColor(colorList[x]);
canvas.drawCircle(pos[i][0], pos[i][1], particleSize, paint);
}
}
public static void setPosition(int i){
// this is wrong
if(moved[i] >= (int)distance[i]/speed){
direction[i] = !direction[i];
setGravity(i);
}
else{
pos[i][0] = pos0[i][0] + speed*moved[i]*(gravity[i][0]- pos0[i][0])/distance[i];
pos[i][1] = pos0[i][1] + speed*moved[i]*(gravity[i][1]- pos0[i][1])/distance[i];
moved[i]++;
}
}
public static void calcDist(int i){
setGravity(i);
distance[i] = (float) Math.sqrt(Math.pow((gravity[i][0]-pos[i][0]),2) + Math.pow((gravity[i][1]-pos[i][1]),2));
}
public static void setGravity(int i){
// do not forget to set pos0 in both cases
if(direction[i]){
gravity[i][0] = gravityX;
gravity[i][1] = gravityY;
}
else{
// make this biased on radius of sphere
gravity[i][0] = random.nextInt(width);
gravity[i][1] = random.nextInt(height);
}
pos0[i][0] = pos[i][0];
pos0[i][1] = pos[i][1];
moved[i]=0;
}
}
主要Activity.java
package com.abc.mygraphics;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import com.abc.mygraphics.MyCanvas;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
//DrawingView dr = new DrawingView(this);
public static SharedPreferences sharedPreferences;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;
sharedPreferences = getSharedPreferences(getPackageName() + "_preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("screenX",width);
editor.putInt("screenY", height);
editor.putInt("x", 200);
editor.putInt("y", 200);
editor.commit();
setContentView(new MyCanvas(this));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// int x = (int)event.getX();
//int y = (int)event.getY();
int x = (int) event.getRawX();
int y = (int) event.getRawY();
//sharedPreferences = getSharedPreferences("CheckSharing",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("x", x);
editor.putInt("y", y);
editor.apply();
MyCanvas.changeGravity();
return false;
}
}
看起來像'MyView'中的'Handler'可能泄露了'MyView'類,然後由於您使用'Handler.postDelayed'的方式泄漏了與其關聯的'Activity'。嘗試暫時註釋掉'Handler'的使用,看看內存問題是否仍然存在(假設這是代碼中的唯一泄漏)。如果不是,我們可以討論一些可能的修復。 –
此外,如果我的猜測是正確的,則根據您的編輯情況,當您在縱向和橫向模式之間來回旋轉設備時,內存使用情況應該會繼續增加,從而導致每次創建託管自定義視圖的活動的新實例。 –
比我做什麼,而不是處理程序??。坦率地說,我不知道我使用它的線程的工作,只是因爲它做我想要的。因爲我需要持續刷新View。我想要的是一個像粒子流的應用程序(在Play商店中搜索)。 –