Подтвердить что ты не робот

Как использовать Runnable в Mono для Android

Я пытаюсь установить Monodroid! Я пытаюсь переписать код Java на С# и иметь некоторые проблемы: я не понимаю, как использовать Runnable. Этот снайпер кода в Java, который я не могу перевести на С#:

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

Можете ли вы объяснить мне, как мне написать этот код и использовать Runnable? Этот Runnable используется для обновления gridview-адаптера и загрузки данных из адаптера в gridview в фоновом режиме. Если я попробовал адаптер обновления в основном потоке? как это (код С#):

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

Активность застревает. Если я не могу использовать Runnable, как я могу реализовать обновление адаптера и gridview в новом потоке? Если я использую потоки С#, например:

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

он генерирует ошибку "System.NullReferenceException"

Спасибо всем за любую помощь! Постскриптум Извините за мой английский:)

4b9b3361

Ответ 1

Кажется, что перегрузка PostDelayed(), которая принимает параметр Action, поэтому простой способ состоял бы в том, чтобы сделать что-то вроде этого:

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

// ...

mHandler.PostDelayed(UpdateGeneration, 1000);

(Отказ от ответственности: я никогда не использовал MonoDroid, но он должен быть прав.)

Ответ 2

Здесь вы переводите реализацию Runnable в С#

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