我制作了从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();
}
}
答案 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();
}
});