2013-02-20 18 views
11

Ben Monodroid lern deniyorum! Java kodunu C# 'ye tekrar yazmaya çalışıyorum ve bazı problemlerim var: Runnable'ı nasıl kullanacağımı anlamıyorum. C# için tercüme coudn't olduğunu, Java kod parçası, mikroişlemciyi That:Nasıl Çalışır android için Mono Runnable kullanın

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); 
     } 
    }; 
    ... 

Ben bu kod yazmak ve Runnable kullanmalıdır bana nasıl açıklayabilir misiniz? Bu Runnable, gridview bağdaştırıcısını güncellemek için kullanılır ve arka plandaki bağdaştırıcıdan ızgara görünümüne veri yükleyin. Güncelleme bağdaştırıcısını ana iş parçacığında denediysem? Bu (C# kodu) gibi:

mAdapter.next() 
mLifeGrid.Adapter = mAdapter; 
Thread.Sleep(1000); 

Aktivite sıkıştı. Runnable'ı kullanamıyorsam, yeni iş parçacığında bağdaştırıcı ve gridview güncelleştirmeyi nasıl uygulayabilirim? böyle C# parçacığı, kullanıyorsanız:

... 
Thread th = new Thread(new ThreadStart(mUpdatGeneration)); 
th.Start(); 
} 
public void mUpdateGeneration() 
{ 
    mAdapter.next() 
    mLifeGrid.Adapter = mAdapter; 
    Thread.Sleep(1000); 
} 

herhangi yardım için tüm bir hata "System.NullReferenceException"

Teşekkür üretir! P.S. İngilizcemde :) için üzgünüm

+1

yılında Runnable uygulanmasını çevirmek, böylece C# parçacığı sınıfları kullanmak nasıl. –

+0

@KirkWoll 'Handler 'bir iş parçacığı sınıfı olmayabilir. Ana etkinlik sırasına göndermek için kullanabileceğiniz sınıf gibi görünüyor. – millimoose

+0

@millimoose, sağ, ama kim Handler'ı uyguladı? Bu bir mono projeyse, Java deyimlerini kullanmamalı. –

cevap

6

orada an overload of PostDelayed() that takes an Action parameter, yani basit bir yolu böyle bir şey yapmak için olacak gibi görünüyor:

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

// ... 

mHandler.PostDelayed(UpdateGeneration, 1000); 

(Destek Aslında MonoDroid hiç kullanmadım ama gerektiği geçerli olması.)

+0

millimoose, geçerli değil, teşekkürler! – Beyka

+0

@Beyka Tam olarak derleme yapmamış olduğu gibi geçerli değil, ya da cevabınız size gerçekten yardımcı olmadı mı? (Yanıtta düzeltmek istiyorum küçük bir sorun varsa). – millimoose

+0

gerçekten birkaç nedenden dolayı değil: Handler.PostDelay 2 parametre (Eylem eylem, uzun delayMillis) var. Bazı Action temsilcilerine mAdapter.next() ve mLifeGrid.Adapter = mAdapter koyarsam, System.NullReferenceException vardı. İsterseniz - kaynak kodunu github'a yükleyebilirim ve sorunu çözmeye çalışın. Bence - bu sorun monodroid geliştiriciler için gerçek. – Beyka

2

Burada bu C# C#

private Java.Lang.Runnable mUpdateGeneration = new Java.Lang.Runnable(() => 
{ 
    mAdapter.next(); 
    mLifeGrid.setAdapter(mAdapter); 
    mHandler.postDelayed(mUpdateGeneration, 1000); 
}); 
İlgili konular