3
 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 アドレスとユーザー名パスワードのパスファイル セクションが true で、インターネットとネットワークのアクセス許可を既に取得していると仮定します...

    button1.setOnClickListener(new OnClickListener() 
    {
        public void onClick(View arg0) 
        {
            new Asenkron().execute("ftpaddress","username","pass","pathfileon telephone"); 
        }
   });

そして、これが潜在的なエラーを分析して私を助けるためのログキャットです...

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);

したがって、テキストビューにエラーが表示され、「Android java.net.UnknownHostException: Host is unresolved」と書かれています。

しかし、ftp サーバーが正しいことはわかっているので、AndFTP アプリケーションから ftp サーバーをチェックします。同じアドレスでログインとパス情報を使用して、ftpサーバーが機能しています.したがって、問題は私のコードにあると思います.どんな助けでも大歓迎です.

4

2 に答える 2

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

編集-使用しているライブラリはその仕事をすることができないかもしれないので、 apachecommonsftpのような新しいライブラリに移ることができます使用方法については、このブログを参照してください。

EDIT2-con.connect(aurl[0]);、がaurl[0]すでに含まれている場合は、ftpクライアントが後で追加するため、http://***削除する必要がありますhttp://(不明なホストが発生します)。また、この行を変更しますcon.setFileType(FTP.BINARY_FILE_TYPE);(パーツを削除しますhttp://

于 2012-10-13T15:35:00.313 に答える
0

わかりませんが、実際のコードを見て評価してみましょう。私の実際のコードはそのようなものです

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

ANDftpアプリケーションで問題なくファイルをアップロードできるので、そのftp情報は正しいです...

以下のコードも試しましたが、うまくいきませんでした

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");

于 2012-10-14T10:50:03.583 に答える