0

我一直在尋找解決方案,在我的android應用程序上的「內存泄漏」問題,但是,這是事情:
我加載片段內viewpager,這個片段有一個GridView和一個適配器(ArrayAdapter),它創建gridview的每個項目,這些項目有一個圖像和一些文本(我使用Universal Image Loader,加載圖像。)

當我收到很多內存泄漏時我改變了設備的方向。
在Android片段上獲取內存泄漏

  • 我已將所有適配器上下文更改爲ApplicationContext。
  • 我已將圖像加載器插件(通用圖像加載器)更改爲 Picasso
  • 我已將ArrayAdapter更改爲BaseAdapter。
  • 我已將Gridview更改爲FlowLayoutView,並將所有項目作爲視圖添加到此新ViewGroup。
  • 還沒有使用android進行「調試」測試。

沒有一個這些變化的工作,我仍然得到內存泄漏,所以,任何幫助,歡迎!

編輯:

public class MoviesFragment extends Fragment { 

public MoviesFragment() { 
} 

final String TAG = MoviesFragment.class.toString(); 
ExpandableHeightGridView movieGridView; 
MovieAdapter mMovieAdapter; 
ArrayList<Movie> movies; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle args = getArguments(); 
    movies = args.getParcelableArrayList("movies"); 
    mMovieAdapter = new MovieAdapter(getActivity().getApplicationContext(), movies); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    final View rootView = inflater.inflate(R.layout.fragment_movies, container, false); 
    movieGridView = (ExpandableHeightGridView) rootView.findViewById(R.id.gridview_movies); 

    if (movies != null) { 

     movieGridView.setAdapter(mMovieAdapter); 
     movieGridView.setExpanded(true); 
     movieGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       EventBus.getDefault().post(
         new EventSelectedEvent((Movie) parent.getItemAtPosition(position))); 
      } 
     }); 
    } else { 
     movieGridView.setExpanded(false); 
    } 
    return rootView; 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

} 

}

public class MovieAdapter extends ArrayAdapter<Movie> { 

Context context; 

public MovieAdapter(Context context, List<Movie> movies) { 
    super(context, 0, movies); 
    this.context = context.getApplicationContext(); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Get the data item for this position 
    Movie movie = getItem(position); 
    // Check if an existing view is being reused, otherwise inflate the view 
    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext().getApplicationContext()).inflate(R.layout.layout_card_movies, parent, false); 
    } 
    // Lookup view for data population 
    TextView movieName = (TextView) convertView.findViewById(R.id.card_movie_text); 

    //Load square image 
    Image squareImg = movie.getSquareImage(); 
    if (null != squareImg) { 
     ImageLoader iLoader = ImageLoaderHandler.getImageLoader(TandasApplication.getInstance()); 
     iLoader.displayImage(squareImg.getLink(), 
       (ImageView) convertView.findViewById(R.id.card_movie_image)); 
    } 

    //Title 
    movieName.setText(movie.getTitle()); 

    //Rating 
    LinearLayout ratingContainer = (LinearLayout) convertView.findViewById(R.id.ratingMovieMainView); 
    double rating = movie.getRating(); 
    UIUtils.buildRatingStars(rating, ratingContainer, context); 

    // Return the completed view to render on screen 
    return convertView; 
} 

}

+0

請發佈Logcat –

回答

0

沒有太多的信息,我想你持有到您的片段引用去。

測試此使用ADB shell命令dumpsys

adb shell dumpsys activity <package_name> 
adb shell dumpsys meminfo <package_name> 

瀏覽各種片段,並在每次瀏覽其中的一個時間後運行此。 Meminfo會告訴你應用程序正在舉辦多少活動。活動爲你打破一切。

如果您發佈一些日誌或代碼,我可以幫助你更好。

+0

嗨,我發佈了一些代碼,當我改變設備方向時,MoviesFragment onCreateView正在設置一個新的適配器。 – vorozco

+0

This:this.context = context.getApplicationContext();可能造成泄漏。您不希望適配器使用應用程序上下文,而是使用活動上下文。 –

+0

最好不要保留對上下文的引用 - 你可以使用convertView.getContext()來代替你使用它的地方。 – gkee