arraylist verkar autocleara när jag försöker nå den ifrån en annan klass, hjälp

Diskussion i 'Frågor, support och diskussion' startad av mardox, 30 nov 2010.

  1. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    Hej, jag har en(eller ja, flera) arrayList som för någon skum anledning verkar tömmas på info när jag försöker nå den ifrån en annan klass.

    såhär ser den relevanta koden ut.

    här deklarerar jag och initierar mina ArrayLists, detta görs högst upp i min huvud klass.
    Kod:
    	public static ArrayList<PendingIntent> notePendingIntents = new ArrayList<PendingIntent>();
    	public static ArrayList<PendingIntent> dictPendingIntents = new ArrayList<PendingIntent>();
    	public static ArrayList<Long> noteFutureTimes = new ArrayList<Long>();
    	public static ArrayList<Long> dictFutureTimes = new ArrayList<Long>();
    
    här adderar jag så många element som jag behöver till min ArrayList.

    OBS. kunde inte skriva "<" tecken i kod rutan utan att det blev knäppt så ersatta det med text.
    Kod:
    int empty = (int) (ID - Notepadv3.notePendingIntents.size() + 1);
    for(int i=0;i"mindre än"empty;i++){
    	Notepadv3.notePendingIntents.add(null);
    	Notepadv3.noteFutureTimes.add(null);
    	}		
    System.out.println(String.format("SÅHÄR STOR ÄR DEN I SETREMINDER!! ----->  %d",Notepadv3.notePendingIntents.size()));
    Notepadv3.notePendingIntents.set(mRowId.intValue(), contentIntent);
    Notepadv3.noteFutureTimes.set(mRowId.intValue(), future.getTimeInMillis());
    
    jag gör en system print som ni ser för att kolla storleken på arrayListen, jag ser då att den givit mig rätt svar.
    jag ersätter då null med en pendingIntent / Long i ett specifikt index, detta gårs utan problem.

    efter detta försöker jag nå den här arrayList ifrån en annan klass via denna kod.
    Kod:
    System.out.println(String.format("SÅHÄR STOR ÄR DEN I NOTENOTY!! ----->  %d",Notepadv3.notePendingIntents.size()));
    
    Notepadv3.notePendingIntents.set(mRowId.intValue(),null);
    Notepadv3.noteFutureTimes.set(mRowId.intValue(),null);
    
    nu försöker jag sätta de här indexen till null igen, men får då en out of bound exception pågrund av att storleken på min ArrayList är 0. vilket även sägs av min system print.

    fattar absolute inte varför detta händer. er kunskap kan säkert få min att förstå:) tack swedroid!
     
  2. tomas_b

    tomas_b Kid Droid Medlem

    Blev medlem:
    23 mar 2010
    Inlägg:
    97
    Mottagna gillanden:
    4

    MINA ENHETER

    Svårt att säga helt utan att se mer sammanhängande kod.

    Vad händer mellan de två sista kodrutorna? Alltså, vid vilka tillfällen exekveras de? Sker det direkt efter varandra? eller kan det gå tid emellan?
     
  3. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    det som händer emellan de två är att den väntar på en alarmmanager att aktivera nästa klass (den klass då arraylist åter är 0). men när jag testar så sätter jag min alarmmanager med 0 millisekuunder väntetid så det sker på direkten.
     
  4. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    hela första metoden
    Kod:
    private void setAlarm(){
    		
    		AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    		String notydisc = null;	
    		
    		k = timeUntilDate();
    			
    			int empty = (int) (ID - Notepadv3.notePendingIntents.size() + 1);
    			for(int i=0;i"mindre än"empty;i++){
    				Notepadv3.notePendingIntents.add(null);
    				Notepadv3.noteFutureTimes.add(null);
    			}		
    			System.out.println(String.format("SÅHÄR STOR ÄR DEN I SETREMINDER!! ----->  %d",Notepadv3.notePendingIntents.size()));
    			Notepadv3.notePendingIntents.set(mRowId.intValue(), contentIntent);
    			Notepadv3.noteFutureTimes.set(mRowId.intValue(), future.getTimeInMillis());
    			
    	    	Toast toast = Toast.makeText(this, String.format("Reminder Set"),  Toast.LENGTH_SHORT);
    	    	toast.show();
    			Cursor c = noteDbHelper.fetchNote(mRowId);
        		startManagingCursor(c);
    			notydisc = c.getString(c.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE));
    			Intent intent1 = new Intent(this, NoteNoty.class);
    			intent1.putExtra("noteid",ID);
    			intent1.putExtra("notename",notydisc);
    			contentIntent = PendingIntent.getBroadcast(getApplicationContext(), 0-mRowId.intValue(), intent1, 0);			
    			alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + k, contentIntent);
    
    			}
    
    hela andra metoden, denna finns i klassen NoteNoty som startas av en alarmManager.
    Kod:
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		System.out.println(String.format("SÅHÄR STOR ÄR DEN I NOTENOTY!! ----->  %d",Notepadv3.notePendingIntents.size()));
    		Bundle extras = intent.getExtras();
    		mRowId = extras != null ? extras.getLong("noteid")
    								: null;
    		notydisc = extras != null ? extras.getString("notename")
    				: null;
    		Intent N = new Intent(context, ShowNote.class);
    		N.putExtra(NotesDbAdapter.KEY_ROWID,mRowId);
    		
    		String ns = Context.NOTIFICATION_SERVICE;
    		mNotificationManager = (NotificationManager) context.getSystemService(ns);
    		
        	notytext = "Note Reminder";
        	noty = new Notification(R.drawable.statusicon, notytext,System.currentTimeMillis());		   	
        	
    		N.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    		k = 0-mRowId.intValue();
    		contentIntent = PendingIntent.getActivity(context, k, N, Intent.FLAG_ACTIVITY_NEW_TASK);
    		noty.setLatestEventInfo(context, notytext, notydisc, contentIntent);
    		mNotificationManager.cancel(k);
    		mNotificationManager.notify(k,noty);
    		//test	
    		Notepadv3.notePendingIntents.set(mRowId.intValue(),null);
    		Notepadv3.noteFutureTimes.set(mRowId.intValue(),null);
    	}
    
     
  5. tomas_b

    tomas_b Kid Droid Medlem

    Blev medlem:
    23 mar 2010
    Inlägg:
    97
    Mottagna gillanden:
    4

    MINA ENHETER

    Du borde tänka om ang. dina statiska variabler. Du kan inte vara säker på att de finns kvar med samma värde som tidigare när du vill använda dem i din andra klass, nu har jag inte helt tid till att kolla genom din kod tyvärr, så jag kan inte se vad som är galet med den förutom det.
     
  6. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    varför är dom statiska?

    Det kan vara så att ditt andra objekt också är en annan tråd.. dvs den tittar i en annan version av din statiska lista.
     
  7. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    jag måste nå samma ArrayList ifrån ett flertal olika klasser, därför antog jag att jag måste göra listan statiskt, om jag inte anger den som statiskt så kan jag väl inte nå samma lista från olika klasser? lär mig fortfarande mycket så förklara gärna lite varför jag inte ska använde en statiskt ArrayList i detta fall, och hur jag gör istället för att i flera olika klasser manipulera och läsa ifrån samma arrayList :)
     
  8. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    Ett alternativ kanske är att använda Application-klassen.

    "Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml's <application> tag, which will cause that class to be instantiated for you when the process for your application/package is created."

    http://developer.android.com/reference/android/app/Application.html

    Ett annat är väl att du läser och skriver från och till databasen, då är du säker på att informationen finns kvar om appen blir nedstängd osv.
     
  9. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    ja att använda databasen som jag redan har är väl ett bra alternativ ifall det inte går att använda arrayList på det sättat jag hade tänkt mig. då tillkommer bara en snabb fråga, är det straight forward att spara PendingIntents i en databas? fungerar det som alla andra typer av data?

    Edit:

    Nu när jag tänker efter har jag ingen aning hur jag ska gå tillväga för att lägga till något annat än strängar i en databas...
     
    Last edited: 30 nov 2010
  10. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    Bump.

    Sorry men jag behöver verkligen hjälp med detta och hitills har jag fått bra svar men de svarar inte riktigt på det jag behöver veta tyvver :/

    Jag tyckte användning av en arraylist verkade som en bra ide men det funkade ju inte som ni ser i ovan inlägg, jag har fortfarande inte förstått varför, vill gärna veta. Det kan ju omöjligt vara så att man aldrig kan nå objekten(longs och pendingintents i mitt fall) i en arraylist från flera olika objekt av mina olika klasser. Kollat runt lite och hittat nåt som är likt arraylist som heter vektor, är det här mitt svar då det står att den syncroniseras ?
    Ett annat alternativ är att koppla de objekten jag nu stoppat i en arraylist direkt till databasen istället(när jag tänker efter är det nog det här jag ska försöka göra då det nog blir säkrast och bäst i längden), men isåfall hade jag behövt lite hjälp på vägen att göra detta då jag bara sparat strängar i
    databaser och aldrig longs och pebdingintents som i mitt fall.

    Vet att någon kan hjälpa och det skulle verkligen uppskattas! :)
     
  11. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    Nu är detta förhållandevis fult... men du skulle kunna ta och serializera ner din pendingintent (om den implementerar serializable) och skriva den till en sträng och lägga ner alltihop i en kolumn i databasen.

    Men som sagt, känns sådär.

    Men det verkar som din pendingintent bara är en integer?
    Då är det ju förhållandevis straightforward att peta ner den i databasen.
     
    Last edited: 1 dec 2010
  12. mardox

    mardox Kid Droid Medlem

    Blev medlem:
    31 jan 2010
    Inlägg:
    73
    Mottagna gillanden:
    6

    MINA ENHETER

    Ok jag tror det kan vara svaret, jag vet dock inte helt å hållet hur pendingintents fungerar så rätta mig om jag har fel.

    Just nu anger jag en integer som Id't på varje pendingintent, antar att det är denna integer du syftar på. Är denna integer det ända som skilljer denna pebdingintent från en annan? För då har jag ju redan dessa integers i min databas då jag använder databasens rowId. Kan jag sedan göra cancel på det pendingintent som associeras med denna integer men tillgång till enbart integern? Min antagabde är då att jag gör en ny pebdingintent med samma id som den jag vill radera och sedan gör cancel(). Har jag rätt? Btw, kan man lägga in integers i en databas utan att göra om dom till strängar först?( lätt gjort men känns som slöseri av tid hehe)

    Tack så mycket! Du har vart guld värd!