2016-04-17 2 views
1

Meine einfache Aktivität hat eine Listenansicht mit 14 Elementen (Genre). Wenn ich die App starte, bekomme ich den Snapshot und normalerweise sind 1 GenreSelectionActivity und 14 Genre im Speicher. dann gehe ich zu anderen Aktivitäten und gehe zurück, es gibt 2 GenreauswahlAktivität und 28 Genre. die Hälfte von ihnen ist rot gefärbt, bedeutet in FinalizerReferenz. dann wird dieselbe Navigation ausgeführt, es wird 3 - 42 und so weiter. ist es normales Verhalten des Finalizers?Android Finalizer endet nie und sammelt alte Objekte, ist es normal?

ich versuche, „System.exit (0)“ zu rufen, wird dabei alte Aktivität gereinigt, aber ein lästiger schwarzer Bildschirm erscheint beim Übergang.

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); 
      } 
     }); 
    } 
} 

dies ist die Adapter i verwenden:

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); 
     } 
    } 
} 

Antwort

0

ich das Problem nicht erkennen kann. Ich habe diese Problemumgehung versucht, es scheint im Moment unproblematisch.

@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(); 
} 
Verwandte Themen