2012-01-17 8 views
0

Я сделал код, который загружает APK с ftp, и я пытаюсь установить его после загрузки. Я написал это для 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

+0

Спасибо, я буду! – Dim

ответ

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

Или вы можете создать обработчик в потоке пользовательского интерфейса, а затем внутри рабочего потока вызвать 'handler.post (new Runnable() {...});'. Вот как я люблю это делать. – Jakar

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)

Хорошо читать это " Безболезненно Threading»в блоге:

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

0

Я думаю, вам нужно передать контекст вашей деятельности в класс, в котором вы хотите использовать методы активности.

0

Для выполнения методов интерфейса вы запустите это на UI тему:

Поместите это в ваши обычные темы запуска() Метод:

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

       startyourActivity(); 
      } 
     }); 
Смежные вопросы