Как использовать 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"
Спасибо всем за любую помощь!
Постскриптум Извините за мой английский:)
Ответы
Ответ 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);
});