-1

私はapachelibを使用して小さなftpクライアントを書いています。ArrayList内のファイルのリストを返しています

import java.io.IOException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import android.os.AsyncTask;
import android.util.Log;

public class myftpTask extends AsyncTask<String, Void, List<FTPFile>> {
    public FTPFile[] FTPFile;
    FTPClient mFtp = new FTPClient();

    @Override
    protected List<FTPFile> doInBackground(String... params) {
        List<FTPFile> myFiles = new ArrayList<FTPFile>();
        // TODO Auto-generated method stub
        try {
            mFtp.connect(params[0], 21);

            if (FTPReply.isPositiveCompletion(mFtp.getReplyCode())) {
                mFtp.login(params[1], params[2]);
                mFtp.enterLocalPassiveMode();
                mFtp.changeWorkingDirectory("/public_html");
                FTPFile files[] = mFtp.listFiles();



                for (int i = 0; i < files.length; i++) { // does not enter here
                    //Log.d("F-> " , ((FTPFile) files[i]).getName().toString());
                    //myFiles.add((FTPFile) files[i]).getName().toString());
                    myFiles.add(files[i]);
                }
                Log.v("Files", myFiles.toString());
                mFtp.disconnect();
            }
        } catch (SocketException e) {
            try {
                mFtp.disconnect();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //return 1;
        return myFiles;

    }
}

そして、私はこのようにそれを受け取っています

import java.util.List;

import org.apache.commons.net.ftp.FTPFile;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.listView1);

        List<FTPFile> listofFiles;

        listofFiles = (List<FTPFile>) new myftpTask().execute(
                "*****", "*****", "******");

        ArrayAdapter<FTPFile> arrayAdapter = new ArrayAdapter<FTPFile>(this,
                android.R.layout.simple_list_item_1, listofFiles);
        lv.setAdapter(arrayAdapter);
    }



}

ただし、リストにキャストできないという例外をスローします。

問題はどこだ?

よろしく

4

3 に答える 3

1

問題 :

listofFiles = (List<FTPFile>) new myftpTask().execute(
                "*****", "*****", "******");

あなたは間違った方向に投げられています

解決策 1:

次のように、メイン UI スレッドで AsyncTask から結果を取得するために get()メソッドを使用 します。

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                    "*****", "*****", "******").get();

ノート :

このソリューションは、docが言うようにAsyncTaskから応答が返されなくなるまでメインスレッドの実行を一時停止します


解決策 2:

onPostExecute(List<FTPFile> result)AsyncTask の実行完了時に Ui をハングさせずに Ui を更新するために使用します

コードを次のように変更するだけです。

public class myftpTask extends AsyncTask<String, Void, List<FTPFile>> {

   //your code here

  @Override
  protected void onPostExecute(List<FTPFile> result) {
   // TODO Auto-generated method stub
   super.onPostExecute(result);
   ArrayAdapter<FTPFile> arrayAdapter = new ArrayAdapter<FTPFile>(this,
                android.R.layout.simple_list_item_1, result);
        lv.setAdapter(arrayAdapter);
  }

}

main Activity から myftpTask タスクを開始します。

public class MainActivity extends Activity {
 ListView lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.listView1);

        new myftpTask().execute("*****", "*****", "******");
    }

}
于 2012-12-15T10:35:27.997 に答える
1

これはコンパイルしますか

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                "*****", "*****", "******");

???

newmyftpTask().execute();この型のオブジェクトを返します AsyncTask<String, Void, List<FTPFile>>

代わりにこれを使用してください

 listofFiles = (List<FTPFile>) new myftpTask().execute(
                    "*****", "*****", "******").get();
于 2012-12-15T10:36:35.163 に答える
0

AsyncTask から戻り値を取得するには、そのget()メソッドを使用する必要があります。

交換、

listofFiles = (List<FTPFile>) new myftpTask().
                                         execute("*****", "*****", "******");

と、

listofFiles = (List<FTPFile>) new myftpTask().
                                    execute("*****", "*****", "******").get();

ただし、これにより UI スレッドがブロックされます。Interfaceしたがって、を作成するかBroadCastReceiver、AsyncTask から値/データを返す方がよいでしょう。これは同じデモです。

于 2012-12-15T10:36:41.763 に答える