Google의 발리 라이브러리를 사용하고 있으며 내 앱의 메모리 누수에 대해 지금과 싸우고 있습니다. 나는 많은 연구를 해왔고 이미 많은 것을 시도했지만 지금은 무엇을해야할지 모른다. 이 샘플 코드 :Android Volley Memory Leaks
SplashActivity.java
public class SplashActivity extends AppCompatActivity {
Context mContext;
AuthRequest mAuthRequest;
GetTokenOnSuccessListener mGetTokenOnSuccessListener;
GetTokenOnErrorListener mGetTokenOnErrorListener;
private ConfigTable mConfigTable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initialiseViewsAndComponents();
}
@Override
protected void onStart() {
super.onStart();
getAuthToken();
}
private void initialiseViewsAndComponents() {
mContext = SplashActivity.this;
mAuthRequest = new AuthRequest(mContext);
mGetTokenOnSuccessListener = new GetTokenOnSuccessListener(mContext);
mGetTokenOnErrorListener = new GetTokenOnErrorListener(mContext);
mConfigTable = new ConfigTable(mContext);
}
private void getAuthToken() {
if (!mConfigTable.get("INITIALISED").equals("")) {
mAuthRequest.guest(mGetTokenOnSuccessListener, mGetTokenOnErrorListener);
} else {
Intent mainIntent = new Intent(mContext, MainActivity.class);
startActivity(mainIntent);
}
}
}
GetTokenOnSuccessListener.java
public class GetTokenOnSuccessListener implements Response.Listener<JSONObject> {
//private Activity mActivity;
private Context mContext;
private ConfigTable mConfigTable;
private int mSuccess = 0;
private String mMessage = "";
public GetTokenOnSuccessListener(Context context) {
//this.mActivity = context;
this.mContext = context;
this.mConfigTable = new ConfigTable(this.mContext);
}
@Override
public void onResponse(JSONObject response) {
try {
mSuccess = Integer.parseInt(response.get("success").toString());
mMessage = response.get("message").toString();
if (mSuccess == 1) {
mConfigTable.setAuthToken(response.get("message").toString());
Intent mainIntent = new Intent(mContext, MainActivity.class);
mContext.startActivity(mainIntent);
((SplashActivity) mContext).finish();
} else {
Toast.makeText(mContext, "Lol access denied, could not retrieve token from server.", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(mContext, "Lol access denied, could not retrieve token from server.", Toast.LENGTH_SHORT).show();
}
}
}
GetTokenOnErrorListener.java
public class GetTokenOnErrorListener implements Response.ErrorListener {
private Context mContext;
public GetTokenOnErrorListener(Context context) {
this.mContext = context;
}
@Override
public void onErrorResponse(VolleyError error) {
Utils.showNetworkResponse(mContext, error);
}
}
지금 좋아 내가 자신에 응답 리스너를 이동 내가 온라인으로 읽을 때 뭔가를 기반으로하는 별도의 수업을 통해 문제가 해결 될 것이라고 생각합니다. eak 그러나 그것을하지 않았다. 보류중인 모든 요청을 취소하는 코드를 추가했습니다. onDestroy() 요청의 태그를 기반으로했지만 여전히 메모리 누수가있었습니다.
이것은 내 스플래시 활동이며 여기 누수가 작기 때문에 finish()를 호출했기 때문에 느낌이 들지만 요청이 성공적으로 완료된 후에 호출하기 때문에 이해가되지 않습니다. 내 모든 다른 활동은 비슷한 코드를 가지고 있지만 11mb만큼 많은 메모리를 누출합니다.
제 질문은 발리 라이브러리로 작업 한 사람이 있습니까? 어떻게 사용하고 메모리 누수를 피할 수 있습니까?
이 버전을 사용 :
compile 'com.android.volley:volley:1.0.0'
https://github.com/google/volley/issues/81 –
나는 이것이 즉시 도움이되지 않는다는 것을 알고 있지만, Volley를 끄는 것이 좋습니다.역사적으로 문서화되지 않았습니다. 다른 사람이 같은 라이브러리를 만든 경우 아무도 라이브러리를 사용하지 않습니다. RxJava는 HTTP 요청뿐만 아니라 모든 비동기 데이터에 대해 안드로이드에 대한 더 나은 추상성을 입증했으며, 더 많은 메모리 누수가 없도록 모든 데이터에서 탈퇴 할 수있는 기능을 제공합니다. RxJava + Retrofit은 Volley와 비교할 때 훨씬 적합합니다. 마이그레이션을 적극 권장합니다. – spierce7
@ spierce7 정규 요청에서도 핵심 원칙을 이해하지 못하면 Rx를 어떻게 사용합니까? 이 누출은 사용 된 라이브러리에 관계없이 피할 수 있습니다. – Dimezis