2012-01-17 140 views
0

我做了从ftp下载APK的代码,我试图在下载后安装它。我为Honeycomb写了这篇文章,所以在每个连接中我都必须使用线程。我如何在线程内的类中使用startActivity,或等待线程完成?下载并安装APK

public class FTPapkDowload { 
protected static final String TAG = "Tablet Development"; 
public FTPClient mFTPClient = null; 
public FTPClient mFtp = null; 

public void Start() { 

Thread apkdowload = new Thread(new Runnable() { 
     @Override 
     public void run() { 

      ftpConnect("mysite", "username", "password",21); 
      Log.d(TAG, "Connected"); 
      ftpDownload("/httpdocs/Shamir/app.apk", "sdcard/Download/app.apk"); 
      ftpDisconnect(); 

      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/Download/" + "app.apk")), "application/vnd.android.package-archive"); 
      startActivity(intent); //Here is the problem 


     } 

     //Connection 
     public boolean ftpConnect(String host, String username, 
       String password, int port) { 
      try { 

       mFTPClient = new FTPClient(); 
       mFTPClient.connect(host, port); 

       if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) { 
        boolean status = mFTPClient.login(username, password); 

        mFTPClient.setFileType(FTP.BINARY_FILE_TYPE); 
        mFTPClient.enterLocalPassiveMode(); 
        return status; 
       } 
      } catch (Exception e) { 
       Log.d(TAG, "Error: could not connect to host " + host); 
      } 

      return false; 
     } 


     //Downloading 
     public boolean ftpDownload(String srcFilePath, String desFilePath) { 
      boolean status = false; 
      try { 

       FileOutputStream desFileStream = new FileOutputStream(
         desFilePath); 
       status = mFTPClient 
         .retrieveFile(srcFilePath, desFileStream); 
       desFileStream.close(); 
       return status; 
      } catch (Exception e) { 
       Log.d(TAG, "download failed"); 
      } 

      return status; 
     } 



     public boolean ftpDisconnect() { 

      try { 
       mFTPClient.logout(); 
       mFTPClient.disconnect(); 
       Log.d(TAG, "Disconected from FTP on apk Download"); 

       return true; 
      } catch (Exception e) { 
       Log.d(TAG,"Error occurred while disconnecting from ftp server on apk download."); 
      } 

      return false; 
     } 

    }); 

    apkdowload.start(); 
} 

}

+0

请给人们的信用为自己的努力帮助你和[接受回答](http://meta.stackexchange.com/a/5235/164138)。你没有接受一个单一的答案! – THelper 2012-01-17 15:43:00

+0

谢谢,我会的! – Dim 2012-01-17 20:17:05

回答

1

Y您可以同时使用一个处理程序:

private Handler handler = new Handler(){ 
     public void handleMessage(Message msg) 
     { 

     } 
    }; 

当你的线程完成运行时需要调用的代码:handler.sendEmptyMessage(0);

更多信息:http://developer.android.com/reference/android/os/Handler.html

+0

或者您可以在UI线程上创建处理程序,然后在工作线程中调用'handler.post(new Runnable(){...});'。这是我喜欢做的。 – Jakar 2012-01-17 15:58:29

0

做到这一点,最彻底的方法是为你的FTP下载的代码来通知你的主线程,它已经完成,使主(UI)线程调用startActivity。为此,您可以使用任意数量的线程间通信方式,例如处理程序:

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

或者干脆Activity.runOnUiThread:

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable

很好看的是“无痛穿线“博客文章:

http://android-developers.blogspot.com/2009/05/painless-threading.html

0

我想你需要通过你的活动的背景下您想要使用活动方法的类。

0

要执行UI方法您已经在UI线程上运行此:

内您的正常线程的run()方法将这个:

 YourClass.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 

       startyourActivity(); 
      } 
     });