Beiträge von Fortuner

    Hallo,


    ich versuche eine Methode zu schreiben, die einen Socket erzeugt und zurückgibt. Dies soll Teil einer Extension für den AppInventor2 werden. Nun habe ich hier ein Problem. Ich habe das Problem in dem AppInventor-Forum beschrieben, dort aber keine Antwort erhalten (hätte ich mich doch gleich hier gemeldet). Ich poste hier einfach mal den gleichen Inhalt, mit der Hoffnung, dass mir hier jemand weiterhelfen kann. Deswegen auf englisch, ich hoffe das ist kein Problem?



    Hi,


    this simple code


    @SimpleFunction(description = "Gibt Socket")
    public Socket GiveSocket(String ip, int port){
    Socket socket2;
    try {socket2 = new Socket(ip, port);
    } catch (IOException e) {
    e.printStackTrace();}
    return socket2;
    }


    is supposed to make method within an extension to return a socket.


    But during compiling, I get the error "variable socket2 might not have been initialized" which is, because initialize the socket inside try{}. But if I initialize it before try{}, I then get the error "Exception IO is never thrown in body of corresponding try statement". So what can I do to satisfy the compiler? To prevent both errors, I thought I could do this:


    Socket socket2 = new Socket;


    try {socket2.connect(ip, port);
    }...


    now the exception throwing connection establishing should be in the try{} statement, and the socket2 variable, which is to be returned, is initialized outside of try{}. Unfortunately, this wont work either, because the connect() method wants a SocketAdress parameter not a IP-String... :(


    Any idea how I could fix this?


    Is it bulls*** in general to make a method which returns a Socket? Or is it possible?


    Thank you

    Danke, du hast das sehr gut erklärt :)


    Das mit dem Memory-Leak habe ich zwar nicht verstanden, weil ich mich mit sowas bisher noch nicht beschäftigt habe, aber den Rest habe ich fast ganz verstanden.


    Ich weiß, dass eine innere Klasse, egal ob anonym oder nicht, Zugriffe auf die Datenfelder der Äußeren Klasse Zugriff hat. Meinst du das mit "Zugriff auf alle Objekte des Elternobjekts"? Oder was wäre das Elternobjekt hier?

    Hallo,


    ich habe kein praktisches Problem, ich muss nur für einen technischen Bericht die Thread-Erzeugung erklären.
    Mit dem nachfolgendenen Beispielcode wird ein Thread gestartet:


    public void Get() { // Capture property values in local variables before running // asynchronously.


    final CapturedProperties webProps = capturePropertyValues("Get");


    AsynchUtil.runAsynchronously(new Runnable() {


    @Override
    public void run() {
    try { performRequest(webProps, null, null); }
    catch (FileUtil.FileException e) { form.dispatchErrorOccurredEvent(Web.this, "Get", e.getErrorMessageNumber()); }
    catch (Exception e) { form.dispatchErrorOccurredEvent(Web.this, "Get", ErrorMessages.ERROR_WEB_UNABLE_TO_GET, webProps.urlString);
    }



    }
    }
    );
    }


    Meine Frage nun: Wie ist denn genau die folgende Zeile Java-syntax-mäßig (fachlich möglichst präzise und korrekt [Blockierte Grafik: https://www.androidpit.de/img/emoticons3/wink.png] ) zu erklären:
    AsynchUtil.runAsynchronously(new Runnable() {...})


    Also AsynchUtil ist eine Klasse aus dem Paket java.lang (richtig formuliert?)
    Mit dieser Zeile wird die statische Methode (da das Objekt AsynchUtil nicht erzeugt wurde, kann diese Methode ja nur aufgerufen werden, wenn sie statsich ist. richtig?) runAsynchronously aufgerufen. Diese Methode erhält als Paramter das frisch erzeugte Objekt (new) Runnable ohne Parameter ( () ). Soweit richtig? Und die geschweiften Klammern dahinter mit einem Programmcode drin... wie ist das java-mäßig genau zu erklären/rechtfertigen? Offensichtlich gehört das alles zum Übergabeparamter von runAsynchronously. Aber ich dachte immer, man kann nur Variablen (Datenfelder oder Objekte) als Parameter an eine Methode übergeben... und nicht ganze Programmcodes und schon garkeine geschweiften Klammern !?
    Ich bedanke mich schonmal.

    Hi Leute,


    Bin neu auf diesem Gebiet und habe gerade meine erste App geschrieben, welche nicht funktioniert.
    Anbei der Code (bitte die ganzen überflüssigen Imports ignorieren).
    Das Layout habe ich nicht geändert, also sollte eigentlich die "Hello world" - Anzeige erscheinen, während das Programm abläuft.
    Auf jeden Fall bekomme ich die Meldung "Filetclient reagiert nicht", wenn ich die App auf mein phone draufspiele. Gradle gibt 0 Fehler und 0 Warnungen raus. Auf dem Server kommt auch kein Verbindungsaufbau an. Mein Phone ist mit dem Server 100%ig verbunden. Das kann ich einfach mit anderen Apps testen.
    Hat jemand eine Ahnung, woran das liegen könnte? Danke!
    package com.example.blabla.filetclient;
    import android.os.Environment;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import java.io.BufferedOutputStream;
    import java.io.IOException;
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io_OutputStream;
    import java.net.Socket;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketException;
    import java.util.Enumeration;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.os.Environment;
    import android.widget.TextView;
    import android.widget.Toast;
    public class MainActivity extends AppCompatActivity {
    Socket socket;
    @override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // android.os.Debug.waitForDebugger();
    try {
    this.socket = new Socket("192.168.178.32", 80);
    } catch (IOException e) {
    e.printStackTrace();
    }
    File file = new File(Environment.getExternalStorageDirectory(),
    "picture.jpg");
    byte[] bytes = new byte[(int) file.length()];
    try {
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    bis.read(bytes, 0, bytes.length);
    bos.write(bytes, 0, bytes.length);
    bos.flush();
    socket.close();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }