Android 개발에 대해 배우기 시작했고 정적 변수에 대해 읽었습니다. 가비지 수집 가능하지 않기 때문에 메모리가 누수 될 수 있습니다.공용 정적 필드/변수를 사용하는 것이 좋지 않습니까?
특정 상황에서 일부를 사용했지만 메모리가 누출 될 우려가 있습니다.
누군가 내 코드를보고 메모리 누출 여부를 확인하십시오.
MainActivity.java
public class MainActivity extends Activity {
public static boolean IS_ACTIVITY_OPEN;
public static ImageView image;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
IS_ACTIVITY_OPEN = true;
....
....
VoiceReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
.....
};
registerReceiver(VoiceReceiver, new IntentFilter(BroadCastReceivers.VoiceIntent));
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(VoiceReceiver);
IS_ACTIVITY_OPEN = false;
}
}
Picture.java
MainActivity.image.setImageBitmap(resizedBitmap);
.....
.....
BroadCast.java
if (!MainAcitivty.IS_ACTIVITY_OPEN) {
//start an activity
Intent intent2 = new Intent(context, MainAcitivty.class);
intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
handler= new Handler();
MyPostDelay = new Runnable() {
@Override
public void run() {
context.sendBroadcast(new Intent(VoiceIntent));
}
};
handler.postDelayed(MyPostDelay, 300);
}
else
{
context.sendBroadcast(new Intent(VoiceleIntent));
}
미리 감사드립니다.
글쎄, 캐싱 뷰는 다시 만들어 지도록 설계되었으므로 뷰를 잘못 작성하면 오브젝트의 상태에 따라 true 또는 false를 반환하는 간단한 getter로 해당 public boolean을 대체 할 수 있기 때문에 뷰를 캐싱하는 것은 좋지 않습니다. 일반적으로 바뀌지 않을 값을 생성하기 위해 final과 결합 된 static을 사용하는 것은 괜찮습니다. "언제 어디서나 액세스 할 수 있어야합니까?"라는 질문에 대답 할 수 없다면 예, 공개 정적 변수와 메소드를 만들지 마십시오. –
무서워하는 경우 데이터를 유지하고 통계 변수를 활동에 넣으면 수신자가 일종의 방식 (예 : 싱글 톤 또는 저렴한 sharedpreference)을 수행하고 이미지 뷰를 보유하는 것이 좋지 않습니다. 오히려 .. imageview.bildDrawingCache()와 같은 뭔가 it.goes google 수 있습니다. – Elltz
귀하의 의견에 진심으로 감사드립니다. SharedPreferences를 사용하여 IS_ACTIVITY_OPEN 부울을 저장 한 다음 BroadCast에서 검색하면 좋을 것입니다. 맞습니까? SharedPreferences에서 IS_ACTIVITY_OPEN 부울을 검색 할 때 새 부울 값이 가비지 수집 가능합니까? 고마워요 –