Smidigaste sättet att hämta data

Diskussion i 'Frågor, support och diskussion' startad av Pajn, 6 maj 2011.

  1. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Vag håller på med en enkel app som ska hämta lite data från nätet.
    Det är ett antal variabler som ska hämtas.

    Dem ligger i en enkel xml fil men då det är jag som har gjort sidan så kan jag göra så att det finns i json eller nått annat format om det passar bättre.

    Dessutom ska datan sparas, vilket är enklaste sättet att göra det på?
     
  2. pirko

    pirko Infant Droid Medlem

    Blev medlem:
    8 april 2011
    Inlägg:
    10
    Mottagna gillanden:
    1

    MINA ENHETER

    Jag tycker det är enklast med json.
    Eller rättaŕe sagt det är det enda jag använder. Man vill skicka så lite data som möjligt mellan app och server och då passar json bäst.
    Dessutom är det väldigt enkelt. När man väl hämtat datat är det bara att använda sig av org.json.JSONObject eller JSONArray för att skapa ett json-objekt från datat.

    Hur ska datat användas? Beroende på det så kan man antingen använda sig av Shared Preferences som är en enkel key-value-lagring eller så använder man en SQLite-databas.
    Jag skulle rekommendera SQLite om du vill hämta ut datat med urval.
     
    Pajn gillar detta.
  3. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Okej, då blir det att sätta sig in i hur json funkar, har tidigare bara läst det och då i php.

    Det är som sagt ett antal variabler, mestadels valutakurser. Så en "key-value-lagring" låter bra. En databas vore att gå till överdrift :)

    Jag antar att det är denna du menar?
    http://developer.android.com/guide/topics/data/data-storage.html#pref

    Här hittade jag en liten guide för json, den går dock inte igenom hur jag får ner det:
    http://www.skill-guru.com/blog/2011/01/26/using-json-in-android/

    Jag lyckas inte hitta nån guide för hur man gör för att få ner json från en sida, har du nått bra tips?
     
  4. pirko

    pirko Infant Droid Medlem

    Blev medlem:
    8 april 2011
    Inlägg:
    10
    Mottagna gillanden:
    1

    MINA ENHETER

    Japp.

    För att anropa en server så använder du klasserna i org.apache.http, som DefaultHttpClient och HttpGet (om du bara ska hämta data).

    Ett förenklat exempel för att anropa en server och få en InputStream:
    Kod:
    String url = "http://urltillserver";
            DefaultHttpClient httpClient = new DefaultHttpClient();
            URI uri;
            InputStream data = null;
            try {
                uri = new URI(url);
                HttpGet method = new HttpGet(uri);
                HttpResponse response = httpClient.execute(method);
                data = response.getEntity().getContent();
            } catch (Exception e) {
                e.printStackTrace();
            }
           
            return data;
    InputStream:en kan du sen göra om till en sträng och sedan skapa ett JSONObject av strängen.
     
  5. Adam2

    Adam2 Adult Droid Medlem

    Blev medlem:
    26 juli 2010
    Inlägg:
    732
    Mottagna gillanden:
    55

    MINA ENHETER

    Ett tredje sätt att att skapa ett URL-object och läsa in detta i en BufferedReader
    Typ såhär:

    Kod:
    try {
       URL url = new URL("http://server.com/");
       InputStream is = url.openStream();
       BufferedReader r = new BufferedReader(new InputStreamReader(is));
    }
     
  6. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Stort tack båda två!

    Jag gjorde ett litet test och tankade google's startsida och visade i en toast och det funkade. Nu är det bara att fixa json på min sida samt lite kod + spara i appen.
     
  7. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Jag har fått igång det, när jag trycker på "Refresh" knappen laddar appen ner json från min sida, trycker in det i variabler och sparar det :)

    Jag skulle vilja ha en automatisk uppdatering med ett visst intervall (ställbart av användaren) Hur gör jag det?
    Jag har googlat en massa men hittar inget som känns rätt. Vill ju inte dra en massa batteri helt i onödan.
     
  8. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 september 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    Kolla in AlarmManger och funktionen setInexactRepeating
     
  9. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Tackar, dock inte helt klart.
    triggerAtTime vad är det och bör jag bry mig? Om jag sätter den till 0 vad händer då?
    operation vad ska jag sätta här? ett anrop eller en hel klass?
     
  10. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 september 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    triiggerAtTime är när alarmet tidigast ska utlösas första gången. Jag antar att du vill sätta det till 0 då du vill att intervallen ska börja på en gång.

    operation är ett PendingIntent som innehåller det Intent som kommer skickas när larmet utlöses. Du får sedan ha en BroadcastReciver som lyssnar på detta Intent som gör en uppdatering av din data.
     
    Pajn gillar detta.
  11. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Tack! Nu funkar det. Tyvärr la man ju en timme på att felsöka koden när det bara var en rad i manifest som fattades.
     
  12. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Nu är det dags igen. Jag tycker det är riktigt svårt att hitta guider för nybörjare inom android programmering.

    Om jag har en jsonarray (alltså en array i json inte jsonarray()) hur gör jag för att få in den i en listview med några av de värdera som finns i jsonarrayen, och när man klickar på en rad så kommer det upp en poppup med resterande information.
     
  13. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Du behöver ha någon form av adapter som du kopplar till din listview. Om du har en enkel array så kan du använda en ArrayAdapter. Behöver du lite mer avancerade items i din lista behöver du göra en egen adapter som ärver BaseAdapter.

    För en popup skapar du antingen en dialog eller en ny activity.
     
  14. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Det är just sånna där svar jag hittar. Inget fel på dem, men som nybörjare behöver jag ha lite mer vägledning :)

    Vad är en "enkel array"? Här är ett exempel på json:
    "{"variabel":"1234","plats":"Bondgård","djur":({"namn":"ulla","sort":"får","ben":"4"},{"namn":"kajsa","sort":"ko","ben":"2"},]}

    Då vill jag visa
    Variabel: 1234
    Plats: Bongård
    Överst och sen en lista:
    -
    Ulla
    får
    -
    Kajsa
    ko
    -
     
  15. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 september 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    Du kommer inte hitta någon guide som beskriver steg för steg hur du ska koda just din applikation. Om du däremot bryter ner ditt problem till ett antal deluppgifter kommer du hitta hur mycket guider och exempel som helst.

    Dessa delar borde du nog dela upp i:
    Definiera en klass Animal med medlemsvariablerna name, kind och numberOfLegs.
    Detta är helt vanlig java-programering.

    Skapa upp en array med Animal-objekt genom att tolka din JSON-sträng
    googla på "parse json android"

    Gör en ListActivty som anväder en ArrayAdapter och visar din data
    goggla på "android arrayadapter listactivty example"

    Ändra layouten för din ListActivty så att du har textfält (TextView) för Variabel och Plats
    Detta är vanlig Andriod GUI-programmering som du exemeplvis kan lära dig i googles Hello VIews tutorial

    Lägg till en lyssnare för når någon trycker på en rad i listan
    googla på "android listactivity onlistitemclick"

    Skicka upp en dialog med lite mer data
    googla på "android activity display dialog"
     
  16. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Nej det förstår jag
    Tack, nu borde jag klara mig :)
     
  17. Magnusart

    Magnusart Youth Droid Medlem

    Blev medlem:
    27 december 2010
    Inlägg:
    169
    Mottagna gillanden:
    52

    MINA ENHETER

    Kolla in GSON som kan automatiskt parsa din JSON till Java-klasser. Är du nybörjare så kan det iof vara bättre att använda de Json-API:er som är inbyggda. GSON kan vara lurigt i vissa specialfall.
     
  18. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Så här långt har jag kommit nu:
    Kod:
    package com.Pajn.sharkremote;
    
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.net.URI;
    import java.util.List;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    
    import com.google.gson.Gson;
    
    import android.app.ListActivity;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    
    public class Playlists extends ListActivity {
    	String gsauth;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.list);
    
            SharedPreferences settings = getSharedPreferences("sharkremote", 0);
            gsauth = settings.getString("gsauth", null);
            if (gsauth == null) {
                Intent intent = new Intent(Playlists.this, Login.class);
    			startActivity(intent);
            }
            
            gsPlaylists objs = null;
            try{
    	        Gson gson = new Gson();
    	        Reader r = new InputStreamReader(getJSONData("http://1.apishark.com/getUserPlaylistsEx/gsauth/" + gsauth));
    	        objs = gson.fromJson(r, gsPlaylists.class);
    	        for(Playlist pl : objs.getPlaylists()){
    	        	//TODO?
    	        }
            }catch(Exception ex){
                ex.printStackTrace();
            }
    
            setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, objs.getPlaylists()));
        }
        public class gsPlaylists {
            private Boolean Success;
            private List<Playlist> playlists;
           
            public Boolean getSuccess() {
                return Success;
            }
            public void setSuccess(boolean success) {
                Success = success;
            }
            public List<Playlist> getPlaylists() {
                return playlists;
            }
            public void setPlaylists(List<Playlist> gsplaylists) {
                this.playlists = gsplaylists;
            }
        }
        public class Playlist {
        	private int PlaylistID;
            private String Name;
            private String Url;
        	private int ModifiedTime;
    
            public int getPlaylistID() {
                return PlaylistID;
            }
            public void setPlaylistID(int PlaylistID) {
                this.PlaylistID = PlaylistID;
            }
            public String getName() {
                return Name;
            }
            public void setName(String name) {
                this.Name = name;
            }
            public String getUrl() {
                return Url;
            }
            public void setUrl(String url) {
                this.Url = url;
            }
            public int getModifiedTime() {
                return ModifiedTime;
            }
            public void setModifiedTime(int ModifiedTime) {
                this.ModifiedTime = ModifiedTime;
            }
        }
        public InputStream getJSONData(String url){
            DefaultHttpClient httpClient = new DefaultHttpClient();
            URI uri;
            InputStream data = null;
            try {
                uri = new URI(url);
                HttpGet method = new HttpGet(uri);
                HttpResponse response = httpClient.execute(method);
                data = response.getEntity().getContent();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return data;
        }
    }
    Det mest irriterande är att jag inte kan testa om det funkar någorlunda eftersom appen krachar när jag försöker starta Activityn Player med felmeddelandet:
    Kod:
    06-08 18:25:27.170: ERROR/AndroidRuntime(572): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f030005
    
    Resuource ID't pekar på layout/player.xml så den finns. Om jag tar bort list.xml och ändrar playlist Activityn (den jag klistrade in här uppe) till nån annan layout så funkar det??? Inget av det har ju med Player att göra.
     
  19. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 augusti 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Nu har "det konsiga felet" fixat sig själv, jag antar att det var en omstar ev Eclipse som gjorde det? Buggit värre...

    Nu har jag iaf kunnat testa koden, och den funkade så när som att jag var tvungen att döpa varieblerna exakt till det dem hette i json strängen (inte så konstigt egentligen).

    Nu undrar jag bara en sak objs.getResult() (objs.getPlaylist() ovan) pekar ju på classen Playlist eller hur?
    Hur får jag den då att bara peka på getName() så att det är vad som skrivs ut i listan?
    objs.getResult().getName() är fel.
     
  20. Adam2

    Adam2 Adult Droid Medlem

    Blev medlem:
    26 juli 2010
    Inlägg:
    732
    Mottagna gillanden:
    55

    MINA ENHETER

    Med risk för att missuppfatta big time (bla pga Tapatalk)...
    getResult() returnerar en List, ur denna måste du sedan plocka ut respektive playlist innan du kör getName(). Utan att veta vad List erbjuder chansar jag på objs.getResult().get(i).getName().
    Detta borde ge dig namnet på den i:te spellistan i listan Playlists i objektet objs.

    Sent from my Nexus S using Tapatalk