0

2.3.3 で Android プロジェクトを作成し、モバイル 2.3.3 で試してみました。すべて正常に動作します。モバイル 4 では動作しなかったので、Android 4 用に再構築しましたが、同じ問題があります。

これはコードです:

public void FTP_Download(){
  String server = "192.168.1.135";
  int port = 21;
  String user = "pc1";
  String pass = "1551";
  FTPClient ftpClient = new FTPClient();
  try {
    ftpClient.connect(server, port);
    ftpClient.login(user, pass);
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    Toast.makeText(getBaseContext(), "download starting.",Toast.LENGTH_LONG).show();
    // APPROACH #1: using retrieveFile(String, OutputStream)
    String remoteFile1 = "i.xml";
    File downloadFile1 = new File("sdcard/i.xml");
    OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
    boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
    outputStream1.close();
    if (success) {
      Toast.makeText(getBaseContext(), "File #1 has been downloaded successfully.",Toast.LENGTH_LONG).show();
    }
  } catch (IOException ex) {
    System.out.println("Error: " + ex.getMessage());
    ex.printStackTrace();
  } finally {
    try {
      if (ftpClient.isConnected()) {
        ftpClient.logout();
        ftpClient.disconnect();
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

ノート:

commons-net-3.1 を使用して接続します。

4

4 に答える 4

2

上記の Android バージョン 2.3 では、メイン UI スレッドからインターネット接続を開始できません。代わりにAsyncTaskを使用する必要があります。AsyncTask を使用していないと仮定しました。もしそうなら、コードを投稿して猫も記録してください。ICS と HoneyComb が UI スレッドで実行できない他の操作の例は次のとおりです:(以下のコメントに投稿されたリンクから) -

  • Socket 接続を開く (つまり、new Socket())。
  • HTTP リクエスト (つまり、HTTPClient および HTTPUrlConnection)。
  • リモートの MySQL データベースに接続しようとしています。
  • ファイルのダウンロード (つまり、Downloader.downloadFile())。
于 2012-11-17T09:49:09.723 に答える
1

@phazorRiseが説明したように、メインUIスレッドを使用してネットワーク接続を開始したり、そこからデータを読み書きしたりしないでください。しかし、AsyncTask を使用してダウンロードを実行することには強く反対します。AsyncTask は短期間の操作用に設計されており、ファイルのダウンロードはそのカテゴリに属しません。

ファイルが大きい場合 (ユーザーに依存すると思われるため、サイズが大きいと言えます)、目標を達成するための最も適切な方法は、サービスを使用してファイルをダウンロードすることです。

RoboSpiceをご覧になることをお勧めします。これにより、アプリケーションのネットワーキングに対する堅牢性が向上します。これは、Android でのネットワーク リクエスト用の最も興味深いライブラリです。

これは、代替手段に慣れ、サービスを使用することが他のどのテクノロジーよりも優れている理由を理解するためのインフォグラフィックです。

于 2012-11-17T09:56:45.567 に答える
1

Android 4 で「インターネット接続」プログラミングを使用する場合、次のように非同期タスクを実行します。

このクラス コードをプリンシパル ファイルと同じファイルに配置して、グローバル変数または関数と相互作用させることができます。

public class MyAsyncTask extends AsyncTask<String, Void, String> {

  @Override
  protected String doInBackground(String... urls) {
    String url = urls[0]        
    try {
      //Connection request code, in your case ftp
    } catch (Exception e) {
      //Catch code
    }
  }

  @Override
  protected void onPostExecute(String result) {
    //Code to de After the connection is done
  }
}

次に、アクティビティで非同期タスクを呼び出します

String url = "http://...";
new MyAsyncTask().execute(url);

編集 ここでは、非同期タスクの使用方法を例とともに説明します

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-11-17T10:26:33.267 に答える
0

このコードを追加しましたが、すべて問題ありません

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

注: 別の投稿の @ user1169115 コメントからコードを取得しました。これは最善の解決策ではありませんが、asynctask が機能しない理由がわからないため、他に選択肢がありません。

于 2012-11-18T07:42:52.280 に答える