Java Android FTP 上传问题 & "Async"
Java Android FTP Upload Issue & "Async"
我正在尝试通过 ftp 从我的 Android 设备上传一个名为 "advancedsettings.xml" 的文件,该文件位于路径“/storage/emulated/0/advancedsettings.xml”中。它似乎没有用;文件未上传并抛出以下异常:
01-06 17:56:17.498 28084-28084/com.name.example.appname E/SmsReceiver﹕ android.os.NetworkOnMainThreadException
我发现基本上,应用程序无法尝试执行网络操作"on its main thread"。
我是 Java 的新人,但我明白,从这里开始,我必须实施 "ASync";我还没有明白如何实施它。有人可以帮我描述一下这个以及我如何根据下面的代码实现它吗?
我的代码如下:
public class FtpUpload {
// use this method to upload the file using file path global var and ftp code,
//then return the link string.
//TO DO: UID file name to prevent file already exists overwrite on server?
public void total() {
FTPClient con = null;
String dest_fname = "advancedsettings.xml"; // Added to create a destination file with a dynamically created name (same as the file name in /sdcard/ftp/)
try
{
con = new FTPClient();
con.connect("ftp.domain.co.uk");
// Check your USERNAME e.g myuser@mywebspace.com and check your PASSWORD to ensure they are OK.
if (con.login("username", "password"))
{
con.enterLocalPassiveMode(); // important!
con.setFileType(FTP.BINARY_FILE_TYPE);
String data = "/storage/emulated/0/advancedsettings.xml";
FileInputStream in = new FileInputStream(data);
boolean result = con.storeFile(dest_fname, in);
in.close();
if (result) Log.v("upload result", "succeeded");
con.logout();
con.disconnect();
} else { // This Error Log was created
// Create error log as a file
File log_file = new File("/storage/emulated/0/error.txt");
try {
FileWriter lfw = new FileWriter(log_file);
BufferedWriter lout = new BufferedWriter(lfw);
// Continue
lout.write("Upload Connection Failed!");
lout.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.e("SmsReceiver", e1.toString());
}
}
}
catch (Exception e)
{
Log.e("SmsReceiver", e.toString());
}
}
提前致谢。
K
可耻的是我最初没有遇到 this documentation on Async Tasks,事实证明这是无价的。
虽然有点即兴,但我让它工作了。我刚刚将 class 修改为:
private class FtpUpload extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
//code here
}
并使用以下调用上述异步方法:
new FtpUpload().execute();
当然,如果不在清单文件中声明以下用户权限(在 "application" 标记之外),您将无法使用 FTP 网络:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
我正在尝试通过 ftp 从我的 Android 设备上传一个名为 "advancedsettings.xml" 的文件,该文件位于路径“/storage/emulated/0/advancedsettings.xml”中。它似乎没有用;文件未上传并抛出以下异常:
01-06 17:56:17.498 28084-28084/com.name.example.appname E/SmsReceiver﹕ android.os.NetworkOnMainThreadException
我发现基本上,应用程序无法尝试执行网络操作"on its main thread"。
我是 Java 的新人,但我明白,从这里开始,我必须实施 "ASync";我还没有明白如何实施它。有人可以帮我描述一下这个以及我如何根据下面的代码实现它吗?
我的代码如下:
public class FtpUpload {
// use this method to upload the file using file path global var and ftp code,
//then return the link string.
//TO DO: UID file name to prevent file already exists overwrite on server?
public void total() {
FTPClient con = null;
String dest_fname = "advancedsettings.xml"; // Added to create a destination file with a dynamically created name (same as the file name in /sdcard/ftp/)
try
{
con = new FTPClient();
con.connect("ftp.domain.co.uk");
// Check your USERNAME e.g myuser@mywebspace.com and check your PASSWORD to ensure they are OK.
if (con.login("username", "password"))
{
con.enterLocalPassiveMode(); // important!
con.setFileType(FTP.BINARY_FILE_TYPE);
String data = "/storage/emulated/0/advancedsettings.xml";
FileInputStream in = new FileInputStream(data);
boolean result = con.storeFile(dest_fname, in);
in.close();
if (result) Log.v("upload result", "succeeded");
con.logout();
con.disconnect();
} else { // This Error Log was created
// Create error log as a file
File log_file = new File("/storage/emulated/0/error.txt");
try {
FileWriter lfw = new FileWriter(log_file);
BufferedWriter lout = new BufferedWriter(lfw);
// Continue
lout.write("Upload Connection Failed!");
lout.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
Log.e("SmsReceiver", e1.toString());
}
}
}
catch (Exception e)
{
Log.e("SmsReceiver", e.toString());
}
}
提前致谢。
K
可耻的是我最初没有遇到 this documentation on Async Tasks,事实证明这是无价的。
虽然有点即兴,但我让它工作了。我刚刚将 class 修改为:
private class FtpUpload extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
//code here
}
并使用以下调用上述异步方法:
new FtpUpload().execute();
当然,如果不在清单文件中声明以下用户权限(在 "application" 标记之外),您将无法使用 FTP 网络:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>