2012-12-15 21 views
-1

我正在使用apache lib編寫一個小型的ftp客戶端。我回國的文件列表中的ArrayList在android中接收參數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); 
    } 



} 

但它扔無法投射到列表中的例外。

問題在哪裏?

問候

+0

哪條線是你得到錯誤/ –

+0

我在哪裏接收數組作爲列表。 –

回答

1

這是否編譯

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

???

newmyftpTask().execute();返回此類型的對象AsyncTask<String, Void, List<FTPFile>>

用這個代替

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

謝謝你的幫助。只是一點點修復:) –

1

問題:

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

你投錯了

解決方案1:

使用在主界面得到結果回來從的AsyncTask get()方法主題爲:

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

注:

該方案暫停你的主線程執行,直到響應不是來自的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); 
    } 

} 

,並開始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("*****", "*****", "******"); 
    } 

} 
+0

那也不錯。謝謝。我將執行它:) –

+0

構造函數ArrayAdapter (myftpTask,int,列表)未定義。錯誤,實施您的解決方案。 –

+0

@MurtazaHussain:如果你有一些最新的代碼,那麼你的代碼中分享的這行代碼也在你的代碼中,那麼你也可以發佈它 –

0

對於來自的AsyncTask獲取返回值,你必須使用其get()方法,

更換,

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

With,

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

但是,這會阻止你的UI線程。所以,最好創建InterfaceBroadCastReceiver以從AsyncTask返回值/數據。 Here是一個相同的演示。