2012-11-17 109 views
0

我在2.3.3上創建了一個Android項目,並在移動設備2.3.3上嘗試了它,一切正常。它不適用於移動4,所以我重新構建了Android 4,但我有同樣的問題。Android應用程序無法在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-淨3.1連接。

+1

您應該爲您的問題添加堆棧跟蹤。我假設你不**在UI線程上調用你的'FTP_Download()'函數? – Jens

+0

什麼是日誌跟蹤輸出,其次最好使用ExtenalStorageDirecory調用來讀取寫入SD卡 – Orlymee

回答

2

在Android 2.3以上版本中,您無法從主UI線程啓動Internet連接。相反,你應該使用AsyncTask。我假定你沒有使用AsyncTask。如果你是,然後張貼代碼並登錄貓也。該ICS和蜂巢不會讓你在UI線程上執行其他操作的一些例子是:(從鏈接張貼在下面的評論) -

  • 打開一個Socket連接(即新的Socket())。
  • HTTP請求(即HTTPClient和HTTPUrlConnection)。
  • 試圖連接到遠程MySQL數據庫。
  • 下載文件(即Downloader.downloadFile())。
+0

你有任何關於這方面的消息來源嗎? – Lucifer

+0

[爲什麼冰淇淋三明治崩潰你的應用程序](http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html) – tolgap

+0

這是說我說的同樣的事情。不是嗎? – SachinGutte

1

您不應該使用主UI線程來啓動網絡連接或從中讀取/寫入數據,因爲@phazorRise解釋了它。但我強烈反對使用AsyncTask來執行下載。 AsyncTask專爲短期生活操作而設計,下載文件不屬於該類別。

如果您的文件很大(並且我認爲這取決於用戶,那麼我們可以說它們很大),實現您的目標的最相關方法是使用服務下載文件。

我邀請您看看RoboSpice,它會爲您的應用提供強大的網絡連接性,它真的是Android上網絡請求最有趣的庫。

這是一個inforgraphics以熟悉替代方案並理解爲什麼使用服務比其他技術更好。

+0

Op提到的下載文件是xml文件。所以它應該不會太大,因爲我估計無法使用AsyncTask。 – SachinGutte

+0

看看圖表,你會明白這個問題。即使它是xml,使用RoboSpice也會更好。此外,你可以使用春天的android模塊,並從盒子中解析出你的xml。 – Snicolas

+0

好的,我會在一個示例項目中嘗試一下。如果它很好,那麼它會成爲我選擇基於網絡的應用程序。 :D – SachinGutte

1

當我使用andoid 4「互聯網conections」節目,我做了一個異步任務如下:

你可以把這個類代碼放到同一個文件作爲主要文件,全局變量或函數intercatue。

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 
    } 
} 

然後,在活動我稱之爲ASYN任務

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

編輯 這裏它解釋瞭如何使用異步任務,用一個例子

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

0

我添加了這段代碼,並且所有的事情都很好

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

StrictMode.setThreadPolicy(policy); 

注意:我從@ user1169115獲取了其他帖子的評論。 這不是最好的解決方案,但我不知道爲什麼asynctask不起作用,所以我沒有其他選擇。

相關問題