我的简单活动有一个包含14个项目(流派)的列表视图。当我运行应用程序时,我得到了快照,内存中正常有1个GenreSelectionActivity和14个流派。然后我转到其他活动并返回,有2个GenreSelectionActivity和28个流派。其中一半是红色的,意思是finalizerReference。然后做同样的导航,它变成了3- 42,以此类推。终结器的行为正常吗?
我尝试在销毁时调用"System.exit(0)“,旧的活动被清除了,但在转换时出现了一个恼人的黑屏。
public class GenreSelectionActivity extends Activity {
Activity activity;
ListView listViewGenre;
GenreList genreList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.genre_list);
activity = this;
createGenrePlayButton();
listViewGenre = (ListView) findViewById(R.id.listGenre);
JSONObject jsonResponseGenres = s.readInternalStoragePrivate(Constants.GENRE_FILE_NAME, getApplicationContext());
JsonResolver jsonResolver = new JsonResolver();
genreList = jsonResolver.getGenreListWithPhasesFromJson(jsonResponseGenres);
final GenreCircularAdapter genreCircularAdapter = new GenreCircularAdapter(activity, R.layout.genre_row, genreList);
listViewGenre.setAdapter(genreCircularAdapter);
listViewGenre.setSelectionFromTop(genreCircularAdapter.MIDDLE, 0);
}
public void createGenrePlayButton() {
ImageView genrePlayButton = (ImageView) findViewById(R.id.genrePlayButton);
genrePlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
Intent questPage = new Intent(activity, QuestionManagerActivity.class);
questPage.putExtra("genre_name", "pop");
Phase selectedPhaseData = new Phase();
selectedPhaseData.setHighScore(0);
questPage.putExtra("selected_phase_data", selectedPhaseData);
activity.startActivity(questPage);
activity.finish();
//System.exit(0);
}
});
}
}这是我使用的适配器:
public class GenreCircularAdapter extends ArrayAdapter<Genre> {
private GenreList genreList;
private Activity activity;
LayoutInflater inflater;
public static final int HALF_MAX_VALUE = Constants.GENRE_CIRCULAR_LISTVIEW_SIZE / 2;
public final int MIDDLE;
public GenreCircularAdapter(Activity activity, int resource, GenreList genreList) {
super(activity, resource, genreList);
this.genreList = genreList;
this.activity = activity;
inflater = LayoutInflater.from(activity);
MIDDLE = HALF_MAX_VALUE - HALF_MAX_VALUE % genreList.size();
}
@Override
public int getCount() {
return Constants.GENRE_CIRCULAR_LISTVIEW_SIZE;
}
@Override
public Genre getItem(int position) {
return genreList.get(position % genreList.size());
}
@Override
public long getItemId(int position) {
return genreList.get(position % genreList.size()).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder genreRowHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.genre_row, parent, false);
genreRowHolder = new ViewHolder();
genreRowHolder.attachChildViews(convertView);
convertView.setTag(genreRowHolder);
} else
genreRowHolder = (ViewHolder) convertView.getTag();
Genre genre = getItem(position);
genreRowHolder.genreName.setText(genre.getName());
try {
int genreImageResID = activity.getResources().getIdentifier(String.valueOf("genre_" + genre.getId()), "drawable", activity.getPackageName());
genreRowHolder.genreImageView.setImageDrawable(activity.getResources().getDrawable(genreImageResID));
genreRowHolder.genreImageView.setColorFilter(0x96064e66, PorterDuff.Mode.SRC_ATOP);
} catch (Exception e){
Log.e("img_not_found", "genre_" + genre.getId() + " - " + getClass().getSimpleName());
}
return convertView;
}
private static class ViewHolder {
public TextView genreName;
public ImageView genreImageView;
public ImageView genreLockImageView;
public void attachChildViews (View convertView) {
genreName = (TextView) convertView.findViewById(R.id.genreName);
genreImageView = (ImageView) convertView.findViewById(R.id.genreImageView);
genreLockImageView = (ImageView) convertView.findViewById(R.id.genreLockImage);
}
}
}发布于 2016-04-20 07:30:41
我没有发现问题所在。我试过这个变通方法,现在看起来没什么问题。
@Override
protected void onDestroy() {
// remove all content view
((FrameLayout)findViewById(android.R.id.content)).removeAllViews();
// empty arraylist
genreList.clear();
genreList.trimToSize();
// call garbage collector (it may not effect anything)
Runtime.getRuntime().gc();
System.gc();
System.runFinalization();
}https://stackoverflow.com/questions/36683269
复制相似问题