下载并安装APK

时间:2012-01-17 15:38:33

标签: java pthreads android

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

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();
}

}

4 个答案:

答案 0 :(得分:1)

您可以使用处理程序:

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

        }
    };

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

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

答案 1 :(得分:0)

最干净的方法是让你的FTP下载代码通知你的主线程它已经完成,并使主(UI)线程调用startActivity。您可以使用任意数量的方法在线程之间进行通信,例如Handler:

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

答案 2 :(得分:0)

我想你需要将活动的上下文传递给你想要使用activity的方法的类。

答案 3 :(得分:0)

要执行UI方法,您可以在UI Thread上运行它:

将它放入正常的Threads run()方法:

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

               startyourActivity();
           }
       });