openfile kommt zu früh...

  • 6 Antworten
  • Letztes Antwortdatum
T

tomycat

Ambitioniertes Mitglied
0
hallo,
ich habe einen Button abfrage die soll:
Nummer.txt per ftp runterladen, öffnen und dann den Inhalt in den Edit darstellen.
Ich tippe auf dem Button, dann kommt Fehler Datei nicht vorhanden. Ok, ich warte 3 sec. und tipp nochmaldrauf. Danngehts.Wie bekomme ich den AndroidSpielzugTask dazu dass er die Datei erst darstellt, wenn sie vorhaben ist.

Code:
    public void onClick(View v)
    {
        if (v == zurueck)
    {
     
       Intent intent = new Intent(this, MainActivity.class);
         this.startActivity(intent);
    }
        if (v == jetztsenden)
    {
          AndroidSpielzugTask androidZug = new AndroidSpielzugTask();
  androidZug.execute();
      //////// Fortnummer anzeigen....

      try {
      File myFile = new File("/storage/emulated/0/Android/nummer_fortlaufend.txt");
      FileInputStream fIn = new FileInputStream(myFile);
      BufferedReader myReader = new BufferedReader(
      new InputStreamReader(fIn));
      String aDataRow = "";
      String aBuffer = "";
       
      ////edit befüllen   
      String txtFuerEdit;
      EditText ip_adresse = (EditText) findViewById(R.id._fort_nummer_edit);
      txtFuerEdit = ip_adresse.getText() + myReader.readLine();
      ip_adresse.setText(txtFuerEdit);   
      ////editbefüllen ende
       
       
      myReader.close();
      //  Toast.makeText(getBaseContext(),
      //       ip_adresse.getText(),
      //  Toast.LENGTH_LONG).show();
       
      } catch (Exception e) {
      Toast.makeText(getBaseContext(), e.getMessage(),
      Toast.LENGTH_SHORT).show();
      }
      ///////////////  Fortnummer anzeigen.ENDE /////////////
    }
       
       
       
  }   
    //AB hier tut
    private class AndroidSpielzugTask extends AsyncTask<Void, Void, Void> {
       
        @Override
        protected Void doInBackground(Void ... args) {


        //ftp kram
        String server = "blLBLblLLllblBLl.alfahosting-server.de";
        int port = 21;
        String user = "************";
        String pass = "***********";
       
        FTPClient ftpClient = new FTPClient();
        try {
       
        ftpClient.connect(server, port);
        ftpClient.login(user, pass);
        ftpClient.enterLocalPassiveMode();
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
       
        String remoteFile1 = "/html/kinup/nummer_fortlaufend.txt";
        File downloadFile1 = new File("/storage/emulated/0/Android/nummer_fortlaufend.txt");
        OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
        boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
        outputStream1.close();
       
        if (success)
        {
        System.out.println("File #1 has been downloaded successfully.");
        }

        }
        catch (IOException ex)
        {
        System.out.println("Error: " + ex.getMessage());
        ex.printStackTrace();
        }
        finally
        {
        try {
        if (ftpClient.isConnected()) {
        ftpClient.logout();
        ftpClient.disconnect();
        }
        } catch (IOException ex) {
        ex.printStackTrace();
        }
        }
                  
        //ftp kram ende    
     
        return null;
          }
         
       
        protected void onPostExecute() 
        {         
         
        }


       }
 
Die onPostExecute Methode wir erst aufgerufen, wenn die doInBackground Methode fertig ist. Wenn du also willst das die Datei erst geöffnet wird, wenn der download fertig ist, solltest du das von der onPostExecute Methode aus anstoßen.
 
  • Danke
Reaktionen: tomycat
ok,danke.
An sowas habe ich auch gedacht. :)
habe den Code try öffne die Datei in die Klammer von onPostExecute verschoben. Leider wird der Code nicht ausgeführt
 
pack alles was zur anzeige gehört in eine eigene Methode deiner Activity (aber aushalb des AsyncTask) und diese methode rufst du dann von der onPostExecute methode auf.
Die Struktur sollte ungefähr so aussehen.
Code:
    @Override
    public void onClick(View v) {
        AndroidSpielzugTask androidZug = new AndroidSpielzugTask();
        androidZug.execute();
    }

    public void anzeigen() {
        // hier das File lesen und das ergebnis anzeigen. Alternativ das File in der onPostExecute lesen und den Inhalt als String an diese Methode übergeben.
    }

    private class AndroidSpielzugTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            // FTP Download
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            MainActivity.this.anzeigen(); // MainActivity durch den Namen deiner Activityklasse austauschen.
        }
    }
 
  • Danke
Reaktionen: tomycat
Code:
public void anzeigen() {
   
    System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
     
     
  Toast.makeText(getBaseContext(),
  "Ladevorgang warxxxl!",
  Toast.LENGTH_LONG).show();
   
   
   
   // hier das File lesen und das ergebnis anzeigen. Alternativ das File in der onPostExecute lesen und den Inhalt als String an diese Methode übergeben.
}
Vielen Dank das du mir hilfst, aber anzeigen() wird nicht ausgeführt.
Ich habe alles 1zu1 übernommen
 
Hmm... Komisch
Kannst du mal in alle Methoden eine Log Meldung schreiben mit Log.d(tag,msg) etwa so:
Code:
    @Override
    public void onClick(View v) {
        Log.d("ich war hier","onClick");
        AndroidSpielzugTask androidZug = new AndroidSpielzugTask();
        androidZug.execute();
    }

    public void anzeigen() {
        Log.d("ich war hier","anzeigen");
        // hier das File lesen und das ergebnis anzeigen. Alternativ das File in der onPostExecute lesen und den Inhalt als String an diese Methode übergeben.
    }

    private class AndroidSpielzugTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            Log.d("ich war hier","doInBackground");
            // FTP Download
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            Log.d("ich war hier","onPostExecute");
            MainActivity.this.anzeigen(); // MainActivity durch den Namen deiner Activityklasse austauschen.
        }
    }

Außerdem mal gucken ob irgendwo exception im LogCat sind. Guck bitte auch, dass es keine leeren Catch-Blöcke gibt. Schreib in alle Catch-Blöcke wenigstens ein printStackTrace(), damit auch keine Exception einfach gefangen wird und nicht im Log auftaucht.
 
  • Danke
Reaktionen: tomycat
ahhhhhhh alles nochmal angeschaut, habe was übersehen. Mega thx an alle. Jetzt gehts :)
 
Zurück
Oben Unten