15

我正在尝试学习 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”

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

4

3 回答 3

6

似乎有一个重载PostDelayed()需要一个Action参数,所以直接的方法是做这样的事情:

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

// ...

mHandler.PostDelayed(UpdateGeneration, 1000);

(免责声明:我从未真正使用过 MonoDroid,但它应该是有效的。)

于 2013-02-20T20:26:12.753 回答
5

以下是在 c# 中翻译 Runnable 实现的方法

private Java.Lang.Runnable mUpdateGeneration = new Java.Lang.Runnable(() =>
{
     mAdapter.next();
     mLifeGrid.setAdapter(mAdapter);
     mHandler.postDelayed(mUpdateGeneration, 1000);
});
于 2013-11-07T23:08:08.817 回答
0

测试这段代码。我希望问题得到解决

      Task.Delay(10).ContinueWith(t =>
        {
            this.RunOnUiThread(() => adepter.NotifyDataSetChanged());

        }, TaskScheduler.FromCurrentSynchronizationContext());
于 2019-10-06T04:41:50.297 回答