I made code that download APK from ftp, and I`m trying to install it after download. I wrote this for Honeycomb, so in every connection i have to use threads. How can I use startActivity in class within thread, or wait for thread to finish?
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();
}
}
You can use a handler:
When your thread is done running the code it needs to call:
handler.sendEmptyMessage(0);More info: http://developer.android.com/reference/android/os/Handler.html