如何在android的Mono中使用Runnable
本文关键字:Runnable Mono android | 更新日期: 2023-09-27 18:00:22
我要试着让Monodroid!我试图将java代码重写到C#,但遇到了一些问题:我不明白如何使用Runnable。这是Java中的一段代码,我无法将其翻译成C#:
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。如果我尝试在主线程中更新适配器?像这样(C#代码):
mAdapter.next()
mLifeGrid.Adapter = mAdapter;
Thread.Sleep(1000);
活动被卡住。如果我不能使用Runnable,如何在新线程中实现适配器和网格视图的更新?如果我使用C#线程,就像这样:
...
Thread th = new Thread(new ThreadStart(mUpdatGeneration));
th.Start();
}
public void mUpdateGeneration()
{
mAdapter.next()
mLifeGrid.Adapter = mAdapter;
Thread.Sleep(1000);
}
它生成一个错误"System.NullReferenceException"
感谢大家的帮助!附言:对不起我的英语:)
似乎有一个PostDelayed()
的过载需要Action
参数,所以最简单的方法是这样做:
void UpdateGeneration()
{
mAdapter.next();
mLifeGrid.setAdapter(mAdapter);
mHandler.PostDelayed(UpdateGeneration, 1000);
}
// ...
mHandler.PostDelayed(UpdateGeneration, 1000);
(免责声明:我从未真正使用过MonoDroid,但它应该是有效的。)
以下是如何在c#中转换Runnable实现
private Java.Lang.Runnable mUpdateGeneration = new Java.Lang.Runnable(() =>
{
mAdapter.next();
mLifeGrid.setAdapter(mAdapter);
mHandler.postDelayed(mUpdateGeneration, 1000);
});
测试此代码。我希望问题能得到解决
Task.Delay(10).ContinueWith(t =>
{
this.RunOnUiThread(() => adepter.NotifyDataSetChanged());
}, TaskScheduler.FromCurrentSynchronizationContext());