2013-02-20 8 views
11

Sto provando a lern Monodroid! Provo a riscrivere il codice java in C# e ho qualche problema: non capisco come usare Runnable. Questo è snipet di codice Java, che coudn't traducono in C#:Come usare Runnable in Mono per Android

public class RunActivity extends Activity implements OnClickListener 
{ 
    ... 

    private Handler mHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.run); 
     ... 
     mHandler = new Handler(); 
     mHandler.postDelayed(mUpdateGeneration, 1000); 
    } 

    private Runnable mUpdateGeneration = new Runnable() 
    { 
     public void run() 
     { 
      mAdapter.next(); 
      mLifeGrid.setAdapter(mAdapter); 

      mHandler.postDelayed(mUpdateGeneration, 1000); 
     } 
    }; 
    ... 

Mi potete spiegare come devo scrivere questo codice e utilizzare Runnable? Questo Runnable può essere utilizzato per aggiornare l'adattatore gridview e caricare i dati dall'adattatore a gridview in background. Se ho provato ad aggiornare l'adattatore nel thread principale? come questo (codice C#):

mAdapter.next() 
mLifeGrid.Adapter = mAdapter; 
Thread.Sleep(1000); 

attività è bloccato. Se non riesco a utilizzare Runnable, come posso implementare l'aggiornamento di adapter e gridview nel nuovo thread? Se uso C# threading, in questo modo:

... 
Thread th = new Thread(new ThreadStart(mUpdatGeneration)); 
th.Start(); 
} 
public void mUpdateGeneration() 
{ 
    mAdapter.next() 
    mLifeGrid.Adapter = mAdapter; 
    Thread.Sleep(1000); 
} 

esso genera un errore "System.NullReferenceException"

Grazie a tutti per qualsiasi aiuto! P.S. Ci scusiamo per il mio inglese :)

+1

Questo è C#, in modo da utilizzare classi C# threading. –

+0

@KirkWoll 'Handler' potrebbe non essere una classe di threading. Sembra essere la classe che puoi usare per postare nella coda degli eventi principale. – millimoose

+0

@millimoose, giusto, ma chi ha implementato 'Handler'? Se questo è un progetto mono, non si dovrebbero usare gli idiomi Java. –

risposta

6

Sembra che ci sia an overload of PostDelayed() that takes an Action parameter, quindi il modo semplice sarebbe quello di fare qualcosa di simile:

void UpdateGeneration() 
{ 
    mAdapter.next(); 
    mLifeGrid.setAdapter(mAdapter); 
    mHandler.PostDelayed(UpdateGeneration, 1000); 
} 

// ... 

mHandler.PostDelayed(UpdateGeneration, 1000); 

(Disclaimer: io non ho mai effettivamente utilizzato MonoDroid, ma dovrebbe essere valido.)

+0

millimoose, non è valido, ma grazie! – Beyka

+0

@Beyka Non è valido in quanto non è stato compilato esattamente, o in quanto la risposta non ti ha davvero aiutato in avanti? (Se c'è solo un problema minore mi piacerebbe risolverlo nella risposta.) – millimoose

+0

non è davvero per pochi motivi: Handler.PostDelay ha 2 parametri (azione Azione, lunga delayMillis). Se metto mAdapter.next() e mLifeGrid.Adapter = mAdapter ad un delegato di Action, ho avuto System.NullReferenceException. Se vuoi, posso caricare il codice sorgente su github e tu cerchi di risolvere il problema. Penso che questo problema sia reale per gli sviluppatori monodroid. – Beyka

2

Ecco come si traduce l'implementazione Runnable in C#

private Java.Lang.Runnable mUpdateGeneration = new Java.Lang.Runnable(() => 
{ 
    mAdapter.next(); 
    mLifeGrid.setAdapter(mAdapter); 
    mHandler.postDelayed(mUpdateGeneration, 1000); 
});