android - Leer el archivo de texto de un servidor ftp y devolverlo desde AsyncTask
android-asynctask return-value (3)
Tengo un txt file
en mi ftp server
. Y todo lo que quiero hacer es leer ese archivo, recuperar el contenido y guardarlo como una cadena usando AsyncTask
. Según entiendo desde el logcat, puedo conectar el ftp server
y puedo cambiar el directorio. Pero no puedo leer el contexto del archivo de texto, y no sé cómo devolverlo desde la clase AsyncTask
.
Y estos son mis códigos:
MainActivity.java
package com.example.ftpdenemeleri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FtpAsync task1 = new FtpAsync();
task1.execute();
}
}
FtpAsync.java
package com.example.ftpdenemeleri;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPCmd;
import android.os.AsyncTask;
public class FtpAsync extends AsyncTask <Void, Void, String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("hostname", 21);
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.USER, "user");
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.PASS, "pass");
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.CWD, "/home/www/bitirme");
InputStream is = new BufferedInputStream(ftpClient.retrieveFileStream("beaglesays.txt"));
System.out.println("Input Stream has opened.");
} catch (IOException ex) {
System.err.println(ex);
}
return null;
}
protected void onPostExecute() {
// TODO: check this.exception
// TODO: do something with the feed
}
}
Hay muchas maneras de leer completamente un InputStream en una cadena. El más fácil sería usar IOUtils.toString()
de Apache Commons IO .
Entonces, asumiendo eso, los cambios serían devolver dicha cadena de doInBackground()
y recibirla en onPostExecute()
.
Intenta comprender AsyncTask claramente. Pocas cosas: (1) Pregunta similar: Cómo hacer un simple archivo ftp get en Android (2) Una vez que obtiene contenido en doInBackground () - devuelve el contenido como String (en este momento está devolviendo null). (3) Agregue el parámetro en onPostExecute (String result) y este será el contenido del archivo.
Tu código debe ser como:
package com.example.ftpdenemeleri;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPCmd;
import android.os.AsyncTask;
public class FtpAsync extends AsyncTask <Void, Void, String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("hostname", 21);
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.USER, "user");
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.PASS, "pass");
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.CWD, "/home/www/bitirme");
InputStream is = new BufferedInputStream(ftpClient.retrieveFileStream("beaglesays.txt"));
System.out.println("Input Stream has opened.");
Scanner s = new Scanner(is).useDelimiter("//A"); // Convert your stream into string
return s.hasNext() ? s.next() : ""; //send the string to onPostExecute()
} catch (IOException ex) {
System.err.println(ex);
}
return null;
}
protected void onPostExecute(String result) {
// TODO: check this.exception
// TODO: do something with the feed
Log.i("Result : ",result);
}
}