我的英语并不完美,但我希望它可以帮助一些试图解决这个问题的人; - )
我正在学习Android编程,我希望你们能帮助我。
我正在尝试从ftp服务器的txt文件中获取字符串。我的字符串被称为“内容”,我试图用我的“texto”TextView显示它。 我正在使用FTPClient来访问ftp服务器。
这是我在MainActivity类中的方法:
public void get_txt() throws MalformedURLException {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("my.ftp.url", 21);
ftpClient.enterLocalPassiveMode();
ftpClient.login("my_user", "my_password");
InputStream inStream = ftpClient.retrieveFileStream("teste.txt");
InputStreamReader isr = new InputStreamReader(inStream, "UTF8");
String contents = isr.toString();
texto.setText(contents);
barra.setEnabled(false);
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
谢谢,我希望你能帮助我:)。
编辑1:我忘了提及。我的应用运行正常,问题是TextView永远不会改变。答案 0 :(得分:1)
最后,在几小时后,我设法做到了!对于那些需要答案的人来说,这是:
public class Principal extends AppCompatActivity {
public static TextView texto;
String contents;
ProgressBar barra;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_principal);
texto = (TextView) findViewById(R.id.texto);
TarefaDownload download = new TarefaDownload();
download.execute();
}
上面的代码是我的MainActivity(我称之为"校长"这里)。我在那里只创建了一个TextView,然后我安装了我的AsyncTask类,名为" TarefaDownload"。这个类是一个私有类,其中放置了访问ftp的所有逻辑。现在让我们看看这个类代码。
private class TarefaDownload extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("my_ftp_link_here", 21);
ftpClient.enterLocalPassiveMode();
ftpClient.login("my_user_login_here", "my_password_here");
ftpClient.changeWorkingDirectory("/");
InputStream inStream = ftpClient.retrieveFileStream("teste.txt");
InputStreamReader isr = new InputStreamReader(inStream, "UTF8");
int data = isr.read();
contents = "";
while(data != -1){
char theChar = (char) data;
contents = contents + theChar;
data = isr.read();
}
isr.close();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
texto.setText(contents);
}
}
所以,基本上我试图从名为&#34; teste&#34;的txt文件中读取单行字符串。方法&#34; doInBackground&#34;在后台运行所有内容(不是吗?),所以访问ftp的所有代码都必须到那里。 然后我创建了一个名为&#34; contents&#34;的字符串,开始从InputStreamReader读取字符(每次一个)并存储在字符串中。您必须注意到String内容正在此方法中使用,但它属于我的MainActivity,因此我可以在AsyncTask类之外访问它。最后,当de doInBackground方法完成时,&#34; onPostExecute&#34;调用methos并将TextView的文本设置为我的String值的值。
这就是全部!您可能会注意到您必须在Manifest文件上添加INTERNET权限(或者您将无法访问ftp服务器):
<uses-permission android:name="android.permission.INTERNET" />
就是这样,您的应用应该从ftp服务器读取数据!