从monotouch转移到monodroid - 异步和线程移植

时间:2012-07-10 02:07:15

标签: xamarin.ios xamarin.android

我有一个小型iOS应用程序(使用monotouch编写),我想要带来monodroid。该端口引发了一些问题,其中一些问题与两个平台在创建UI以及围绕它们创建类的方式有关。

在iOS应用中,有类似的代码

private void BtnSomething_TouchUpInside (object sender, EventArgs e)
    {
        string f = this.foo;
                    LGPM gpm = new LGPM(Constants.a, Constants.b, f);
        this.auth = new Auth("cheese", gpm);
    (*) this.auth.TokenReceived += (o, e, a, aTS, r) => {
                    // more stuff here
        };

        this.PresentModalViewController(this.auth, true);
    }

auth类看起来像这样

public partial class Auth
{
    public Auth(string m, data d)
    {
       this.d = d;
       this.m = m;
    }

 // create a UIWebView and do things

Upshot - auth创建webview,执行操作并将控制权返回到(*)行

对于monodroid,事情是不同的,因为你无法真正创建这样的类。我想出的最好的就是这个

private void BtnSomething_TouchUpInside (object sender, EventArgs e)
    {
        string f = this.foo;
                    LGPM gpm = new LGPM(Constants.a, Constants.b, f);
        this.auth = new Auth("cheese", gpm, context);
    (*) this.auth.TokenReceived += (o, e, a, aTS, r) => {
                    // more stuff here
        };

        this.PresentModalViewController(this.auth, true);
    }

然后在Auth类中

public class Auth : Application
{
    public Auth(string m, data d, Context c)
    {
       this.d = d;
       this.m = m;
       Intent t = new Intent(this, typeof(webview));
       t.PutExtra("todo", 1);
       c.StartActivity(t);
    }
}

[Activity]

这是一个“正常”的网页浏览活动。

这似乎有效,但是,一旦webview完成,控制就不会返回到(*)行。

webview本身正在执行从网站(称为AuthToken)的异步数据抓取,这会导致事件一旦完成就抛出。我不确定这两者之间是如何编写类和活动的差异,但是在iOS版本中,事件被触发,在Android版本中,它被遗漏了。

这让我想知道平台在处理异步事件方面的不同方式。是否有关于两个平台如何处理异步事件的区别的教程?

我知道很多问题,但线程和异步事件很重要。

由于

1 个答案:

答案 0 :(得分:0)

使用startActivityForResult或其他Android-ism在一些处理事件后获取线程。