如果你看到这篇文章,请你帮我分析一下,猜测的也可以,当然有大神一下锁定问题所在,感激不尽
问题描述:在学习一个Demo,Onboading,ViewPager滑动到第三页时,通过调用LinearLayout.scrollToPositionWithOffset,滑动ViewPager,让RecyclerView跟着滑动。可我模仿它的代码,却发现如果我滑动到这个页面,调用这个函数,会导致分配给应用的内存迅速增加,50MB>>>90MB.而我不调用这个函数时,一切正常。这个程序在华为(6.0)上运行,滑到第三页时,会卡顿,接着再来回滑动两三次就会闪退。但是在oppo(4.3)上面却没什么问题。 接着我猜测是因为加载本地图片太多太大导致的,于是我用了Glide加载本地图片。结果一切正常,Memory也稳定在50MB左右。在华为手机上也能运行正常。 原因似懂非懂,可能是我还没有学到的知识点。
注:加载的图片是本地的。
Demo的fragment
public class SceneThreeFragment extends BaseSceneFragment {
private static final int SCROLL_OFFSET = 200;
private Point transitionDistance;
private int scrollOffsetX;
private int finishWidth, finishHeight;
private FragmentSceneThreeBinding binding;
public static SceneThreeFragment newInstance(int position) {
SceneThreeFragment scene = new SceneThreeFragment();
Bundle args = new Bundle();
args.putInt(KEY_POSITION, position);
scene.setArguments(args);
return scene;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
binding =
DataBindingUtil.inflate(inflater, R.layout.fragment_scene_three, container, false);
setRootPositionTag(binding.root);
setRecyclerView(binding.recycler1, getResources().obtainTypedArray(R.array.images_1));
setRecyclerView(binding.recycler2, getResources().obtainTypedArray(R.array.images_2));
setRecyclerView(binding.recycler3, getResources().obtainTypedArray(R.array.images_3));
setRecyclerView(binding.recycler4, getResources().obtainTypedArray(R.array.images_4));
setRecyclerView(binding.recycler5, getResources().obtainTypedArray(R.array.images_5));
if (savedState != null) {
transitionDistance = savedState.getParcelable("transitionDistance");
finishWidth = savedState.getInt("finishWidth");
finishHeight = savedState.getInt("finishHeight");
scrollOffsetX = savedState.getInt("scrollOffsetX");
moveScrollViews(0);
// make sure finish view is invisible
ImageView finishView =
(ImageView) binding.recycler2.getLayoutManager().findViewByPosition(3);
if (finishView != null) {
finishView.setVisibility(View.INVISIBLE);
}
Log.e("Three","OncreteView invoked");
}
return binding.getRoot();
}
private void setRecyclerView(RecyclerView recyclerView, TypedArray drawables) {
LinearLayoutManager layoutManager =
new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
ImageAdapter adapter = new ImageAdapter(drawables);
recyclerView.setAdapter(adapter);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("transitionDistance", transitionDistance);
outState.putInt("scrollOffsetX", scrollOffsetX);
outState.putInt("finishWidth", finishWidth);
outState.putInt("finishHeight", finishHeight);
}
@Override
public void enterScene(ImageView sharedElement, float position) {
if (transitionDistance == null) {
setTransition(sharedElement);
}
binding.root.setAlpha(1 - position);
sharedElement.setX(transitionDistance.x * (1 - position));
sharedElement.setY(-getResources().getDimension(R.dimen.tutorial_shared_element_translate_y)
+ (transitionDistance.y * (1 - position)));
scaleSharedElement(position, sharedElement);
setSharedImageRadius(sharedElement, position);
moveScrollViews(position);
}
private void setTransition(ImageView sharedElement) {
// get the finish view
ImageView finishView =
(ImageView) binding.recycler2.getLayoutManager().findViewByPosition(3);
finishView.setVisibility(View.INVISIBLE);
finishHeight = finishView.getHeight();
finishWidth = finishView.getWidth();
Point finishViewLocation = ViewHelper.getViewLocation(finishView);
// find the point of the screen(middle - half image) and for final point to be centered
int screenCenterX = ViewHelper.getDisplaySize(getActivity()).x / 2;
int finishWidth = finishView.getWidth() / 2;
int finishX = screenCenterX - finishWidth;
// the distance the recyclerview needs to scroll for the finish view to be centered
scrollOffsetX = finishX - finishViewLocation.x;
Point sharedLocation = ViewHelper.getViewLocation(sharedElement);
transitionDistance = new Point();
transitionDistance.x = finishX - sharedLocation.x;
transitionDistance.y = finishViewLocation.y - sharedLocation.y;
}
@Override
public void centerScene(ImageView sharedElement) {
binding.root.setAlpha(1.0f);
// make sure shared element is set in the correct place
sharedElement.setX(transitionDistance.x);
sharedElement.setY(-getResources().getDimension(R.dimen.tutorial_shared_element_translate_y)
+ transitionDistance.y);
scaleSharedElement(0, sharedElement);
setSharedImageRadius(sharedElement, 0);
moveScrollViews(0);
}
//position goes from -1.0 to 0.0
@Override
public void exitScene(ImageView sharedElement, float position) {
// last scene, it wont exit
}
@Override
public void notInScene() {
// reset scroll views
moveScrollViews(1.0f);
binding.root.setAlpha(0);
}
private void moveScrollViews(float position) {
// use and odd and even scroll so images don't end up perfectly aligned
int scroll = (int) (scrollOffsetX * (1 - position) + SCROLL_OFFSET);
scrollRecycleViewTo(binding.recycler1, -scroll);
scrollRecycleViewTo(binding.recycler2, scroll);
scrollRecycleViewTo(binding.recycler3, -scroll);
scrollRecycleViewTo(binding.recycler4, scroll);
scrollRecycleViewTo(binding.recycler5, -scroll);
Log.e("Scroll","Scroll:"+scroll);
}
private void scrollRecycleViewTo(RecyclerView recyclerView, int offset) {
LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
layoutManager.scrollToPositionWithOffset(2, offset);
}
private void scaleSharedElement(float position, ImageView sharedElement) {
float scaleX = 1 - ((float) finishWidth / sharedElement.getWidth());
float scaleY = 1 - ((float) finishHeight / sharedElement.getHeight());
// scale around the center
sharedElement.setPivotX(1.0f);
sharedElement.setPivotY(1.0f);
// scale the shared image to the finish views size
sharedElement.setScaleX((1 - (scaleX * (1 - position))));
sharedElement.setScaleY((1 - (scaleY * (1 - position))));
}
}
Demo的ImageAdapter
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {
private TypedArray images;
public ImageAdapter(TypedArray dataSet) {
images = dataSet;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.row_image, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.image.setImageDrawable(images.getDrawable(position));
}
@Override
public int getItemCount() {
return images.length();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public ViewHolder(View view) {
super(view);
image = (ImageView) view;
}
}
}
我的Fragment
public class FragmentThree extends BaseFragment{
private View root;
private RecyclerView recycler1;
private RecyclerView recycler2;
private RecyclerView recycler3;
private RecyclerView recycler4;
private RecyclerView recycler5;
private int scrollOffsetX;
private Point sharedElemScrollPoint;
private int finishHeight;
private int finishWidth;
public static FragmentThree newInstance(int position){
FragmentThree scene = new FragmentThree();
Bundle args = new Bundle();
args.putInt(KEY_POSITION, position);
scene.setArguments(args);
return scene;
}
@Override
public int getLayoutId() {
return R.layout.fragment_three;
}
@Override
public void init(View view) {
root=view.findViewById(R.id.root);
setRootPositionTag(root);
if(root==view){
Log.e("SAME","SAME");
}
recycler1=(RecyclerView) view.findViewById(R.id.recycler_1);
recycler2=(RecyclerView) view.findViewById(R.id.recycler_2);
recycler3=(RecyclerView) view.findViewById(R.id.recycler_3);
recycler4=(RecyclerView) view.findViewById(R.id.recycler_4);
recycler5=(RecyclerView) view.findViewById(R.id.recycler_5);
setRecyclerView(recycler1,getResources().obtainTypedArray(R.array.images_1));
setRecyclerView(recycler2,getResources().obtainTypedArray(R.array.images_2));
setRecyclerView(recycler3,getResources().obtainTypedArray(R.array.images_3));
setRecyclerView(recycler4,getResources().obtainTypedArray(R.array.images_4));
setRecyclerView(recycler5,getResources().obtainTypedArray(R.array.images_5));
}
private void setRecyclerView(RecyclerView recyclerView, TypedArray drawables) {
LinearLayoutManager layoutManager =
new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
ImageAdapter adapter = new ImageAdapter(drawables);
recyclerView.setAdapter(adapter);
}
@Override
public void enter(@Nullable ImageView shareElem, float position) {
if(sharedElemScrollPoint==