如何在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"

感谢大家的帮助!附言:对不起我的英语:)

如何在android的Mono中使用Runnable

似乎有一个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());