0

jDroidlib ライブラリを含む Android ゲームでプログラミングしています。そして、SD カードに書き込まれたファイルをアップロードしたいと考えています。Java 用の Apache FTPClient をダウンロードしたところ、サーバーにアップロードするための次のコードが見つかりました。

FTPClient ftpClient = new FTPClient();
try {
    ftpClient.connect(InetAddress.getByName("server"));
    ftpClient.enterLocalPassiveMode();
    ftpClient.login("username", "password");
    ftpClient.changeWorkingDirectory("android");
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    BufferedInputStream buffIn=null;
    buffIn=new BufferedInputStream(new FileInputStream("storage/sdcard0/Labyrinthal Quest/Scores.txt"));
    ftpClient.enterLocalPassiveMode();
    ftpClient.storeFile("Scores.txt", buffIn);
    buffIn.close();
    ftpClient.logout();
    ftpClient.disconnect(); 
} 

catch (Exception e) {
    Context context = getApplicationContext();
    CharSequence text = "Well, that failed!";
    int duration = Toast.LENGTH_SHORT;

    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
}

問題は、このコードを jDroidLib-Activities の 1 つで実行すると完全に動作しますが、通常の Android アクティビティでは動作しません (Toast に「まあ、失敗しました!」と表示されます)。

アプリがインターネットにアクセスするための許可もマニフェストで作成しました。

どうすればいいのか本当にわかりません。あるアクティビティでは機能しますが、他のアクティビティでは機能しません...

私が設定しなければならない他の設定はありますか?
特別な子スレッドでしか実行できないので何か設定しなければならないことはありますか? しかし、このコードは子スレッドを作成しますね:

FTPClient ftpClient = new FTPClient();

- - アップデート - -

323go によると、おそらく NetworkOnMainThreadException が発生した可能性があり、それが問題だったに違いありません。ネットワーク スレッドは子化する必要があります。だから私は自分のコードを新しいスレッドで囲んだだけで、今は動作します:

new Thread(new Runnable() {
                public void run() {
                    FTPClient ftpClient = new FTPClient();
                     try {
                         ftpClient.connect(InetAddress.getByName("server"));
                            ftpClient.enterLocalPassiveMode();
                            ftpClient.login("username", "password");
                            ftpClient.changeWorkingDirectory("android");
                            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                            BufferedInputStream buffIn=null;
                            buffIn=new BufferedInputStream(new FileInputStream("file directory"));
                            ftpClient.enterLocalPassiveMode();
                            ftpClient.storeFile("filename", buffIn);
                            buffIn.close();
                            ftpClient.logout();
                            ftpClient.disconnect(); 
                    } 


                     catch (Exception e) {


                         Context context = getApplicationContext();
                         CharSequence text = "wurde net hochjeladn!";
                         int duration = Toast.LENGTH_SHORT;

                         Toast toast = Toast.makeText(context, text, duration);
                         toast.show();
                    }
                }
              }).start();
4

1 に答える 1

0

323goによると、おそらくNetworkOnMainThreadExceptionが発生し、それが問題だったに違いありません。ネットワークスレッドは子孫である必要があります。だから私はちょうど私のコードを新しいスレッドで囲みました、そしてそれは今動作します:

new Thread(new Runnable() {
                public void run() {
                    FTPClient ftpClient = new FTPClient();
                     try {
                         ftpClient.connect(InetAddress.getByName("server"));
                            ftpClient.enterLocalPassiveMode();
                            ftpClient.login("username", "password");
                            ftpClient.changeWorkingDirectory("android");
                            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                            BufferedInputStream buffIn=null;
                            buffIn=new BufferedInputStream(new FileInputStream("file directory"));
                            ftpClient.enterLocalPassiveMode();
                            ftpClient.storeFile("filename", buffIn);
                            buffIn.close();
                            ftpClient.logout();
                            ftpClient.disconnect(); 
                    } 


                     catch (Exception e) {


                         Context context = getApplicationContext();
                         CharSequence text = "wurde net hochjeladn!";
                         int duration = Toast.LENGTH_SHORT;

                         Toast toast = Toast.makeText(context, text, duration);
                         toast.show();
                    }
                }
              }).start();
于 2013-01-04T15:30:59.083 に答える