- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
class Asenkron extends AsyncTask<String,Integer,Long>
{
@Override
protected Long doInBackground(String... aurl)
{
FTPClient con=null;
try
{
con = new FTPClient();
con.connect(aurl[0]);
if (con.login(aurl[1], aurl[2]))
{
con.enterLocalPassiveMode(); // important!
con.setFileType(http://FTP.BINARY_FILE_TYPE);
FileInputStream in = new FileInputStream(new File(aurl[3]));
boolean result = con.storeFile(aurl[3], in);
in.close();
con.logout();
con.disconnect();
}
}
catch (Exception e)
{
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
return null;
}
protected void onPostExecute(String result) {}
}
我正在使用如下所示的这个类。有一个按钮,每当我单击该按钮时,它应该在后台启动 FTP 上传过程,但我收到“程序已不幸停止”错误。 假设 ftp 地址和用户名密码路径文件部分是真实的,并且我已经顺便获得了互联网和网络权限......
button1.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
new Asenkron().execute("ftpaddress","username","pass","pathfileon telephone");
}
});
这是供您分析潜在错误并帮助我的 logcat ...
10-13 13:01:25.591: I/dalvikvm(633): threadid=3: reacting to signal 3
10-13 13:01:25.711: I/dalvikvm(633): Wrote stack traces to '/data/anr/traces.txt'
10-13 13:01:25.921: D/gralloc_goldfish(633): Emulator without GPU emulation detected.
10-13 13:01:31.441: W/dalvikvm(633): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
10-13 13:01:31.461: E/AndroidRuntime(633): FATAL EXCEPTION: AsyncTask #1
10-13 13:01:31.461: E/AndroidRuntime(633): java.lang.RuntimeException: An error occured while executing doInBackground()
10-13 13:01:31.461: E/AndroidRuntime(633): at android.os.AsyncTask$3.done(AsyncTask.java:278)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-13 13:01:31.461: E/AndroidRuntime(633): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.lang.Thread.run(Thread.java:856)
10-13 13:01:31.461: E/AndroidRuntime(633): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10-13 13:01:31.461: E/AndroidRuntime(633): at android.os.Handler.<init>(Handler.java:121)
10-13 13:01:31.461: E/AndroidRuntime(633): at android.widget.Toast$TN.<init>(Toast.java:317)
10-13 13:01:31.461: E/AndroidRuntime(633): at android.widget.Toast.<init>(Toast.java:91)
10-13 13:01:31.461: E/AndroidRuntime(633): at android.widget.Toast.makeText(Toast.java:233)
10-13 13:01:31.461: E/AndroidRuntime(633): at com.example.ftpodak.ODAK$Asenkron.doInBackground(ODAK.java:74)
10-13 13:01:31.461: E/AndroidRuntime(633): at com.example.ftpodak.ODAK$Asenkron.doInBackground(ODAK.java:1)
10-13 13:01:31.461: E/AndroidRuntime(633): at android.os.AsyncTask$2.call(AsyncTask.java:264)
10-13 13:01:31.461: E/AndroidRuntime(633): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-13 13:01:31.461: E/AndroidRuntime(633): ... 5 more
顺便把相关代码改成那样;
代替
catch (Exception e)
{
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
我用这段代码替换了
catch (Exception e)
{
HATA=e.toString();
}
然后我将代码添加到按钮
textview1.setText(HATA);
所以我可以在 textview 上看到错误,它正在写“Android java.net.UnknownHostException:主机未解析”
但我知道 ftp 服务器是正确的,我从 AndFTP 应用程序检查 ftp 服务器。使用相同的地址登录并传递信息 ftp 服务器正在工作。所以我认为问题出在我的代码中。任何帮助将不胜感激。任何可以帮助我的人我都可以给 teamviewer 来分析问题所在......
最佳答案
您可以从这一行得到问题的提示:Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
。您正在尝试从非主线程的线程执行 UI 操作。所有 UI 更改都应从主线程执行。
注释掉这一行,它将起作用:
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
不是显示 toast 来通知用户异常,而是使用 boolean
告诉 Activity
子类(调用 async
task) 表示有异常并相应地 toast 。
EDIT- 您正在使用的库可能无法完成这项工作,因此您可以转移到一个新的库,例如 apache commons ftp .引用this blog查看如何使用它。
EDIT2- 如果在con.connect(aurl[0]);
中,aurl[0]
已经包含了http://***
,您必须删除 http://
,因为 ftp 客户端稍后会附加它(导致未知主机)。同时更改此行 con.setFileType(FTP.BINARY_FILE_TYPE);
(删除 http://
部分)
关于android ftp上传已停止错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873598/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!