【问题标题】:android ftp upload has stopped errorandroid ftp 上传已停止错误
【发布时间】:2012-10-04 03:02:38
【问题描述】:
 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 分析问题是什么......

【问题讨论】:

  • 抱歉,错误日志在哪里?

标签: android networking upload background ftp


【解决方案1】:

你可以从这行得到问题的提示: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();

使用boolean 告诉Activity 子类(调用async 任务)发生异常并相应地显示一个toast,而不是显示toast 来通知用户。

EDIT- 您正在使用的库可能无法完成这项工作,因此您可以切换到一个新库,例如 apache commons ftp。参考this blog了解如何使用。

EDIT2- 如果在con.connect(aurl[0]);aurl[0] 中已经包含http://***,则必须删除http://,因为ftp 客户端稍后会附加它(导致未知主机)。还要更改此行con.setFileType(FTP.BINARY_FILE_TYPE);(删除http:// 部分)

【讨论】:

  • 是的,删除 Toast 命令行可以帮助我避免程序已停止错误。但它仍然无法将文件上传到我的 ftpserver。
  • 我已经在我的项目中使用了 apache commons-net-ftp-2.0 库。
  • 你能用相同的代码和你的ftp地址信息告诉我程序是否工作吗?你用你的ftp地址试过了吗?
  • 已编辑答案。见con.setFileType(FTP.BINARY_FILE_TYPE);。删除该行中的 http://
  • 我删除了它,但它是一样的顺便说一句,你可以帮助我使用teamviewer,我将非常感激。找到真正的问题后,我们将再次从这里发布
【解决方案2】:

我不知道,但让我们看看我的真实代码并评估; 我的真实代码是这样的

new Asenkron().execute("ftp://liseacy:gokgok81@ftp.drivehq.com/","liseacy","gokgok81","/mnt/extSdCard/MUZIK/VERIBAK.TXT");

而且 ftp 信息正确,因为我可以毫无问题地使用 ANDftp 应用程序上传文件...

我也尝试了下面的代码,但它也没有奏效

new Asenkron().execute("liseacy:gokgok81@ftp.drivehq.com/","liseacy","gokgok81","/mnt/extSdCard/MUZIK/VERIBAK.TXT");

我试过了也没用;

new Asenkron().execute("ftp.drivehq.com/","liseacy","gokgok81","/mnt/extSdCard/MUZIK/VERIBAK.TXT");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2012-05-13
    • 2014-10-21
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多