1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

(RejectedExecutionException) Activity ruft ListAdapter mehrmals auf!!

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von padde83, 02.08.2010.

  1. padde83, 02.08.2010 #1
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    Hallo und Guten Tag zusammen.

    Ich arbeite gerade mit einer Kombination einer ListView und GridView und eine ViewFlipper.
    Durch den ViewFlipper will ich dem Benutzer die Möglichkeit geben zwischen den beiden Views hin und her zu wechseln.

    Die ListView wird als erstes geladen die XML-Struktur ist die folgende
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
    <ViewFlipper android:id="@+id/viewflipper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:flipInterval="15000"
        android:autoStart="false">
        <include layout="@layout/listlayout"></include>
        <include layout="@layout/gridlayout"></include>
        </ViewFlipper>
    </LinearLayout>
    
    In meiner Activity gehe ich so vor:
    Code:
    ..
    @Override
        protected void onCreate(Bundle savedInstanceState)
    
    ListView listView = (ListView) findViewById(R.id.list);
            listView.setClickable(true);
            listView.setAdapter(new ListAdapter(Activity.this, "oben genanntes Schema", elements)); //Enthält eine ArrayList mit elementen
            listView.setOnScrollListener(new OnScrollListener(Activity.this));
            listView.setOnItemClickListener(new OnItemClickListener()); //
    
    GridView gridView = (GridView) findViewById(R.id.grid);
            gridView.setClickable(true);
            gridView
                    .setAdapter(new GridAdapter(Activity.this, "oben genanntes Schema", elements));  //Enthält eine ArrayList mit elementen
            gridView.setOnItemClickListener(new OnItemClickListener(Activity.this));
    
    
    Die Adapter für beide Views habe ich angepasst.
    Code:
    public class ListAdapter extends ArrayAdapter<T>{
    public ListAdapter(Context context, int viewId, List<T> objects)
        {
            super(context, viewId, objects);
            this.context = context;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            if (convertView != null)
            {
                layout = (LinearLayout) convertView;
            }
            else
            {
                layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.listlayout, parent, false);
            }
    }
    .... usw. start asyncTask
    }
    

    Nun zu meinem Problem:

    In der Activity werden die Adapter für die jeweiligen Views mehrmals direkt hintereinander aufgerufen.:(
    Normal sollte es ja so sein, dass einmal der ListAdapter und einmal der GridAdapter aufgerufen wird.:confused:

    Dies ist leider nicht der fall beide werden auch wenn nur ein Element in der Liste enthalten ist 4-6x aufgerufen.

    Normal ist dies ja kein Problem aber im Adapter starte ich einen AsyncTask der somit auch unnötig oft aufgerufen wird.
    Das führt zu einer RejectedExecutionException, wenn sich mehrere Elemente in der Liste befinden.:mad:

    Ist es irgendwie möglich dies zu Unterbinden. Oder habe ich die Implementierung des Adapters falsch verstanden?:cool:

    Gruß & Danke:)
    padde83
     
  2. padde83, 02.08.2010 #2
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    Anscheinend ist die maximale Anzahl von Tasks auf 10 limitiert.:mad:

    Gibt es eine Möglichkeit diese Anzahl zu erhöhen?
    Durch Recherchen bin ich auf den ThreadPoolExecutor gestoßen, mit dem man
    setMaximumPoolSize(int) aufrufen kann.

    Hat jmd. schon etwas Erfahrung mit? Nen Plan wo ich das genau aufrufen soll hab ich nun nicht! :D

    Gruß
    padde83
     
  3. padde83, 03.08.2010 #3
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    Guten Morgen.:)

    Habe das oben genannte Beispiel mal etwas modifiziert.
    Ich habe das Laden der ListView bzw. der GridView in ein Buttonevent gepackt.
    Und siehe da es wird alles so ausgeführt wie es soll. :confused:

    Code:
    button.setOnClickListener(new Button.OnClickListener()
            {
    
                public void onClick(View v){
    listView.setAdapter(....)); 
    gridView.setAdapter(...));
    }
    
    
    Nun verstehe ich aber immer noch nicht warum es hier genau 1x mal (Ok halt nur bei ButtonEvent) und ohne Button beim Start der Activity(in onCreate) gleich 5-6 mal aufgerufen wird. :mad:

    Gruß & Danke
    padde83
     
  4. padde83, 03.08.2010 #4
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    So konnte das Problem etwas eingrenzen.
    Anscheinend wird der Adapter nicht 5 mal aufgerufen sondern die getView-Methode.

    Mein Adapter:
    Code:
    public class MyListAdapter extends ArrayAdapter<T>{
    
      public MyListAdapter(Context context, int viewId, List<T> objects){
       super(context, viewId, objects);
      }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
    LinearLayout layout;
    
            if (convertView != null)
            {
                layout = (LinearLayout) convertView;
            }
            else
            {
                layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.list_view, parent, false);
            }
    
    return layout;
    }
    
    
    Warum wird die getView-Methode 5 mal aufgerufen. Ich verstehs net.:mad:

    Hoffe irgendjemand hat nen Anhaltspunkt!!

    padde83
     
  5. padde83, 03.08.2010 #5
    padde83

    padde83 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    50
    Erhaltene Danke:
    0
    Registriert seit:
    17.06.2010
    Eine pure Alleinunterhaltung hat auch sein Vorteile. Habe das Problem gelöst.:D

    Lösung:
    ListView und layout_height="wrap_content" vertragen sicht nicht. Mit wrap_content ist die ListView dazu gezwungen die höhe und die weite für jedes element neu zu berechnen was zu einem erneuten Aufruf von getView führt. Einfach wrap_content durch fill_parent ersetzten und schon wird getView nicht mehrmals aufgerufen.

    gruß
    padde83
     

Diese Seite empfehlen