Bey*_*yka 13 c# xamarin.android runnable
我试着勒芒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);
}
};
...
Run Code Online (Sandbox Code Playgroud)
你能解释一下我如何编写这段代码并使用Runnable吗?此Runnable用于更新gridview适配器并在后台从适配器加载数据到gridview.如果我在主线程中尝试更新适配器?像这样(C#代码):
mAdapter.next()
mLifeGrid.Adapter = mAdapter;
Thread.Sleep(1000);
Run Code Online (Sandbox Code Playgroud)
活动停滞不前.如果我不能使用Runnable,我怎样才能在新线程中实现适配器和gridview的更新?如果我使用C#线程,就像这样:
...
Thread th = new Thread(new ThreadStart(mUpdatGeneration));
th.Start();
}
public void mUpdateGeneration()
{
mAdapter.next()
mLifeGrid.Adapter = mAdapter;
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)
它会生成错误"System.NullReferenceException"
感谢所有人的帮助!PS抱歉我的英文:)
看起来有一个PostDelayed()带Action参数的重载,所以直截了当的方法就是这样做:
void UpdateGeneration()
{
mAdapter.next();
mLifeGrid.setAdapter(mAdapter);
mHandler.PostDelayed(UpdateGeneration, 1000);
}
// ...
mHandler.PostDelayed(UpdateGeneration, 1000);
Run Code Online (Sandbox Code Playgroud)
(免责声明:我从未真正使用过MonoDroid,但它应该是有效的.)
这是在C#中翻译Runnable实现的方法
private Java.Lang.Runnable mUpdateGeneration = new Java.Lang.Runnable(() =>
{
mAdapter.next();
mLifeGrid.setAdapter(mAdapter);
mHandler.postDelayed(mUpdateGeneration, 1000);
});
Run Code Online (Sandbox Code Playgroud)