2013-02-20 9 views
11

Staram się wspierać Monodroid! Próbuję ponownie napisać kod java do C# i mam pewien problem: nie rozumiem, jak używać Runnable. To snipet kodu w Javie, że coudn't przetłumaczyć C#:How-to use Runnable in Mono dla Androida

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); 
     } 
    }; 
    ... 

Czy możesz wyjaśnić mi jak mam napisać ten kod i użyć Runnable? To narzędzie Runnable umożliwia zaktualizowanie adaptera gridview i ładowanie danych z adaptera do widoku siatki w tle. Czy po wypróbowaniu adaptera aktualizacji w głównym wątku? w ten sposób (kod C#):

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

Aktywność utknęła. Jeśli nie mogę użyć opcji Runable, jak mogę zaimplementować aktualizację adaptera i gridview w nowym wątku? Jeśli używam C# wątków, na przykład:

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

to generuje błąd "System.NullReferenceException"

Dzięki wszystkim za pomoc! P.S. Przepraszam za mój angielski :)

+1

To jest C#, więc należy używać klas C# gwintowania. –

+0

@KirkWoll 'Handler' może nie być klasą wątków. Wydaje się, że jest to klasa, której możesz użyć do publikowania w głównej kolejce zdarzeń. – millimoose

+0

@montimoose, prawda, ale kto wdrożył 'Handler'? Jeśli jest to projekt mono, nie powinno się używać idiomów Java. –

Odpowiedz

6

Wydaje się, że istnieje an overload of PostDelayed() that takes an Action parameter, więc najprostszym sposobem byłoby zrobić coś takiego:

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

// ... 

mHandler.PostDelayed(UpdateGeneration, 1000); 

(Zastrzeżenie: Nigdy nie faktycznie używany MonoDroid, ale powinien ważność.)

+0

millimoose, to nie ważne, ale dzięki! – Beyka

+0

@Beyka To nie jest poprawne, ponieważ nie skompilowało się dokładnie, lub że odpowiedź nie pomogła ci naprawdę do przodu? (Jeśli jest tylko drobny problem, który chciałbym rozwiązać w odpowiedzi.) – millimoose

+0

to nie jest tak naprawdę z kilku powodów: Handler.PostDelay ma 2 parametry (akcja, długi delayMillis). Jeśli umieściłem mAdapter.next() i mLifeGrid.Adapter = mAdapter do delegata akcji - miałem wyjątek System.NullReferenceException. Jeśli chcesz - mogę przesłać kod źródłowy do githuba i spróbować rozwiązać problem. Myślę - ten problem jest aktualny dla monodroidów. – Beyka

2

Oto jak to przetłumaczyć Runnable wdrożenia w C#

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