Avatar billede pcmalle Juniormester
20. september 2016 - 12:35 Der er 6 kommentarer og
1 løsning

Android Studio - overføre variabel fra en klasse til MainActivity

Har fundet nedenstående stump kode flere steder på nettet og koden fungerer i sig selv.
Det jeg ønsker er at kunne læse indholdet af strengen "inputLine" i MainActivity.
Koden ligger i sin egen klasse kaldet URLReader.


public class URLReader {
    public static void main(String[] args) throws Exception {
        URL verisign = new URL("https://www.verisign.com/");
        BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                verisign.openStream()));

        String inputLine;

        while ((inputLine = in.readLine()) != null)
            System.out.println(inputLine);

        in.close();
    }
}
Avatar billede arne_v Ekspert
20. september 2016 - 15:03 #1
Der er den trivielle: flyt den kode fra main til der hvor du skal bruge den.

:-)
Avatar billede arne_v Ekspert
20. september 2016 - 15:05 #2
Du kan ogsaa wrapper koden som en metode:

public static String getContent(String urlstr) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((new URL(urlstr)).openConnection().getInputStream()));
        StringBuilder res = new StringBuilder();
        String line;
        while((line = br.readLine()) != null) {
            res.append(line);
            res.append("\r\n");
        }
        br.close();
        return res.toString();
    }

og bare kalde med:

noget = klasse.getContent(urlstr);
Avatar billede pcmalle Juniormester
21. september 2016 - 08:04 #3
Tak for hurtigt svar...kunne ikke umiddelbart få koden til at virke, men skal lige bruge lidt mere tid på det...vender tilbage.
Avatar billede pcmalle Juniormester
04. oktober 2016 - 12:25 #4
Har prøvet at flytte koden til MainActivity, men så crasher appen.

Kaldet "noget = klasse.getContent(urlstr):" kan jeg ikke få til at virke.
Hvor i metoden er selve URL'en?
Avatar billede Vixo Novice
24. oktober 2016 - 00:17 #5
Håber ikke at det er for sent jeg skriver, men her er min løsning på dit problem :-)

Det som arne siger er sådanset rigtigt, men i Android vil du højst sandsynligt få fejl da kaldet vil køre i din main thread.
Jeg har lavet en nested class inde i min MainActivity, som extender AsyncTask. Det er fordi at man, i Android, ikke skal lave krævene handlinger i main thread. Ved at bruge AsyncTask kan du lave dit kald, asynkront.

public class MainActivity extends AppCompatActivity {

    String test;
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.testTxt);

        new myCall().execute();
    }

    public class myCall extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... voids) {
            BufferedReader br = null;
            try {
                br = new BufferedReader(new InputStreamReader((new URL("https://www.verisign.com/")).openConnection().getInputStream()));
                StringBuilder res = new StringBuilder();
                String line;
                while((line = br.readLine()) != null) {
                    res.append(line);
                    res.append("\r\n");
                }
                br.close();
                return res.toString();

            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String aVoid) {
            super.onPostExecute(aVoid);

            test = aVoid;
            textView.setText(test);
        }
    }
}

Jeg kører kaldet i onCreate metoden: "new myCall.execute();"
doInBackground() metoden kører asynkront og sender stringen videre til onPostExecute som IKKE kører asynkront. Det er via denne metode at du kan sende resultatet tilbage til MainActivity (det kan også gøres på andre måder end det, jeg har gjort).

TextView'et er bare noget jeg har lavet for at outputte resultatet i app'en :-)
Håber det hjælper
Avatar billede pcmalle Juniormester
25. oktober 2016 - 20:06 #6
Hej Vixo

Bortset fra en lille fejl, der skulle rettes i linjen
" textView = (TextView) findViewById(R.id.testTxt);"
fungerer koden perfekt...efter at jeg huskede at tilføje linjen
"<uses-permission android:name="android.permission.INTERNET" />"
til AndroidManifest.xml.

Tusind tak for hjælpen :-)

Jeg havde selv kigget lidt på AsyncTask, men kunne ikke få det til at fungere.
Jeg er helt ny i Android programmering, men har dog programmeret i en del andre sprog.
Kender du måske nogen gode gratis steder på nettet, der kan hjælpe mig med at lære Android?
Avatar billede Vixo Novice
25. oktober 2016 - 21:21 #7
Ja, glemte lige at skrive det med internet permission :-)

Det bedste sted (efter min mening) er Androids egen hjemmeside.
De forklare tingene rigtig godt og kommer ofte med gode eksempler. Held og lykke med det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester