2010-06-12 13 views
2

Je souhaite renvoyer les données d'un Thread à Activity (qui a créé le thread).Transmettre les données du thread dans l'activité

alors je fais comme décrit à la Android documentation:

public class MyActivity extends Activity { 

    [ . . . ] 
    // Need handler for callbacks to the UI thread 
    final Handler mHandler = new Handler(); 

    // Create runnable for posting 
    final Runnable mUpdateResults = new Runnable() { 
     public void run() { 
      updateResultsInUi(); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     [ . . . ] 
    } 

    protected void startLongRunningOperation() { 

     // Fire off a thread to do some work that we shouldn't do directly in the UI thread 
     Thread t = new Thread() { 
      public void run() { 
       mResults = doSomethingExpensive(); 
       mHandler.post(mUpdateResults); 
      } 
     }; 
     t.start(); 
    } 

    private void updateResultsInUi() { 

     // Back in the UI thread -- update our UI elements based on the data in mResults 
     [ . . . ] 
    } 
} 

Une seule chose que je suis absent ici - où et comment définir mResults pour que je puisse y accéder à la fois Activity et Thread, et serait également capable de modifier au besoin? Si je le définis comme final dans MyActivity, je ne peux plus le changer en Thread - comme il est montré dans l'exemple ...

Merci!

Répondre

2

Si vous définissez mResults dans la classe et non la méthode, vous pouvez la modifier à partir de l'un ou l'autre emplacement. Par exemple:

protected Object mResults = null; 

(utilisation protégée parce it's faster)

+2

Les performances Android doc suggère la portée du paquet, non protégé. protégé peut entraîner la fuite des détails d'implémentation dans des sous-classes à l'extérieur de votre paquet. – adamp

+0

Cela devrait être «volatile» pour fonctionner. – Gray