/**
* 內存使用檢測:能夠調用系統的getMemoryInfo()來獲取當前內存的使用狀況
*/
private void initMemoryInfo() {
ActivityManager activityManager = (ActivityManager) Utils.getApp()
.getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
if (activityManager != null) {
activityManager.getMemoryInfo(memoryInfo);
LogUtils.d("totalMem=" + memoryInfo.totalMem + ",availMem=" + memoryInfo.availMem);
if (!memoryInfo.lowMemory) {
// 運行在低內存環境
}
}
}
複製代碼
public class LeakActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak);
textView = (TextView)findViewById(R.id.text_view);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"rotation",0,360);
objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
objectAnimator.start();
}
}
複製代碼
@Override
protected void onDestroy() {
super.onDestroy();
mAnimator.cancel();
}
複製代碼
private static TestResource mResource = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(mResource == null){
mResource = new TestResource();
}
}
class TestResource {
//裏面代碼引用上下文,Activity.this會致使內存泄漏
}
複製代碼
//add監聽,放到集合裏面
tv.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
@Override
public void onWindowFocusChanged(boolean b) {
//監聽view的加載,view加載出來的時候,計算他的寬高等。
}
});
複製代碼
//計算完後,必定要移除這個監聽
tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this);
複製代碼
tv.setOnClickListener();//監聽執行完回收對象,不用考慮內存泄漏
tv.getViewTreeObserver().addOnWindowFocusChangeListene,add監聽,放到集合裏面,須要考慮內存泄漏
複製代碼
//add監聽,放到集合裏面
tv.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
@Override
public void onWindowFocusChanged(boolean b) {
//監聽view的加載,view加載出來的時候,計算他的寬高等。
}
});
複製代碼
//計算完後,必定要移除這個監聽
tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this);
複製代碼
tv.setOnClickListener();//監聽執行完回收對象,不用考慮內存泄漏
tv.getViewTreeObserver().addOnWindowFocusChangeListene,add監聽,放到集合裏面,須要考慮內存泄漏
複製代碼
@Override
protected Parcelable onSaveInstanceState() {
//異常狀況保存重要信息。
//return super.onSaveInstanceState();
final Bundle bundle = new Bundle();
bundle.putInt("selectedPosition",selectedPosition);
bundle.putInt("flingSpeed",mFlingSpeed);
bundle.putInt("orientation",orientation);
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
final Bundle bundle = (Bundle) state;
selectedPosition = bundle.getInt("selectedPosition",selectedPosition);
mFlingSpeed = bundle.getInt("flingSpeed",mFlingSpeed);
orientation = bundle.getInt("orientation",orientation);
return;
}
super.onRestoreInstanceState(state);
}
複製代碼
@Override
public void onError(Throwable e) {
//直接調用便可
ExceptionUtils.handleException(e);
}
複製代碼
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
LoggerUtils.e("initRecyclerView"+ "恢復Glide加載圖片");
Glide.with(ImageBrowseActivity.this).resumeRequests();
}else {
LoggerUtils.e("initRecyclerView"+"禁止Glide加載圖片");
Glide.with(ImageBrowseActivity.this).pauseRequests();
}
}
});
複製代碼
/**
* 設置播放器類型,必須設置
* 注意:感謝某人建議,這裏限定了傳入值類型
* 輸入值:111 或者 222
* @param playerType IjkPlayer or MediaPlayer.
*/
public void setPlayerType(int playerType) {
mPlayerType = playerType;
}
複製代碼
/**
* 設置播放器類型,必須設置
* 注意:感謝某人建議,這裏限定了傳入值類型
* 輸入值:ConstantKeys.IjkPlayerType.TYPE_IJK 或者 ConstantKeys.IjkPlayerType.TYPE_NATIVE
* @param playerType IjkPlayer or MediaPlayer.
*/
public void setPlayerType(@ConstantKeys.PlayerType int playerType) {
mPlayerType = playerType;
}
/**
* 經過註解限定類型
* TYPE_IJK IjkPlayer,基於IjkPlayer封裝播放器
* TYPE_NATIVE MediaPlayer,基於原生自帶的播放器控件
*/
@Retention(RetentionPolicy.SOURCE)
public @interface IjkPlayerType {
int TYPE_IJK = 111;
int TYPE_NATIVE = 222;
}
@IntDef({IjkPlayerType.TYPE_IJK,IjkPlayerType.TYPE_NATIVE})
public @interface PlayerType{}
複製代碼
@Retention(RetentionPolicy.SOURCE)
public @interface ViewStateType {
int HAVE_DATA = 1;
int EMPTY_DATA = 2;
int ERROR_DATA = 3;
int ERROR_NETWORK = 4;
}
複製代碼
gradlew app:dependencies
複製代碼
| | | | | | \--- android.arch.core:common:1.1.1 (*)
| | | | \--- com.android.support:support-annotations:26.1.0 -> 28.0.0
| +--- com.journeyapps:zxing-android-embedded:3.6.0
| | +--- com.google.zxing:core:3.3.2
| | \--- com.android.support:support-v4:25.3.1
| | +--- com.android.support:support-compat:25.3.1 -> 28.0.0 (*)
| | +--- com.android.support:support-media-compat:25.3.1
| | | +--- com.android.support:support-annotations:25.3.1 -> 28.0.0
| | | \--- com.android.support:support-compat:25.3.1 -> 28.0.0 (*)
| | +--- com.android.support:support-core-utils:25.3.1 -> 28.0.0 (*)
| | +--- com.android.support:support-core-ui:25.3.1 -> 28.0.0 (*)
| | \--- com.android.support:support-fragment:25.3.1 -> 28.0.0 (*)
\--- com.android.support:multidex:1.0.2 -> 1.0.3
複製代碼
api (rootProject.ext.dependencies["zxing"]){
exclude module: 'support-v4'
exclude module: 'appcompat-v7'
}
複製代碼
Bitmap bitmap = bitmaps.get(position);
//正常是用來處理圖片這種佔用內存大的狀況
bitmapSoftReference = new SoftReference<>(bitmap);
if(bitmapSoftReference.get() != null) {
viewHolder.imageView.setImageBitmap(bitmapSoftReference.get());
}
//其實看glide底層源碼可知,也作了相關軟引用的操做
複製代碼
private MyHandler handler = new MyHandler(this);
private static class MyHandler extends Handler{
WeakReference<FirstActivity> weakReference;
MyHandler(FirstActivity activity) {
weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
}
}
}
複製代碼