如何从另一个项目启动Activity

时间:2016-12-04 03:54:28

标签: c# android json xamarin windows-phone

我正在为Android和Windows-phone的天气应用程序工作。所以我在“Parsing Class”中的“Weather.Api(Portable)”中的另一个项目中编写公共代码。 “Weather.Droid”用于Android。image

ParsingClass的代码如下:

    public static string tempGlobal;
    public static string cityTextGlobal;
    private static string GovnoTemperature;

    public async  Task<string> dataByCity(string city)
    {
        var url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&APPID="+AppID;

        //ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
        await FetchAsync(url);
        return city;
    }

    public async Task<double> Data_down(double lat, double lon)
    {

        var url = String.Format(
          "http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&units=metric&APPID=" + AppID);

        //ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
        await FetchAsync(url);

        return lat;
    }

    public async Task<string> FetchAsync(string url)
    {
        string jsonString;

        using (var httpClient = new System.Net.Http.HttpClient())
        {
            var stream = await httpClient.GetStreamAsync(url);
            StreamReader reader = new StreamReader(stream);
            jsonString = reader.ReadToEnd();
        }

        var json = jsonString;

        JsonValue firstitem = json;
        var mydata = JObject.Parse(json);

        cityTextGlobal = (mydata["name"]).ToString();

        string GovnoData = (mydata["main"]).ToString();

        //spliting string
        string[] values = GovnoData.Split(',');
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = values[i].Trim();
            if (i == 0)
            {
                //tempGlobal = values[i];
                GovnoTemperature = values[i];
            }
        }
        tempGlobal = null;
        foreach (char c in GovnoTemperature)
        {
            if (c == '.')
            {
                break;
            }
            if (c == '-' || char.IsDigit(c) == true || c == '.')
            {
                tempGlobal += c.ToString();
            }
        }

        return jsonString;
    }
}

public class Coord
{
    public double lon { get; set; }
    public double lat { get; set; }
}

public class Weather
{
    public int id { get; set; }
    public string main { get; set; }
    public string description { get; set; }
    public string icon { get; set; }
}

public class Main
{
    public double temp { get; set; }
    public int pressure { get; set; }
    public int humidity { get; set; }
    public int temp_min { get; set; }
    public int temp_max { get; set; }
}

public class Wind
{
    public double speed { get; set; }
    public double deg { get; set; }
}

public class Clouds
{
    public int all { get; set; }
}

public class Sys
{
    public int type { get; set; }
    public int id { get; set; }
    public double message { get; set; }
    public string country { get; set; }
    public int sunrise { get; set; }
    public int sunset { get; set; }
}

public class RootObject
{
    public Coord coord { get; set; }
    public List<Weather> weather { get; set; }
    public string @base { get; set; }
    public Main main { get; set; }
    public int visibility { get; set; }
    public Wind wind { get; set; }
    public Clouds clouds { get; set; }
    public int dt { get; set; }
    public Sys sys { get; set; }
    public int id { get; set; }
    public string name { get; set; }
    public int cod { get; set; }
}

}

我需要从方法:

启动“Weather.Droid”的MainActivity
  

public async Task FetchAsync(string url)

返回之前:

  

jsonString

我该怎么做?

2 个答案:

答案 0 :(得分:1)

似乎你所依赖的是依赖注入。在可移植项目中声明一个接口,然后在Droid / iOS /中实现它。您支持的项目。

我在XLabs社区项目中创建了IOC的抽象。 Matt Whetton写了一些关于如何使用它的非常好的指示:http://www.codenutz.com/getting-started-xamarin-forms-labs-xaml-mvvm-ioc/

以下方法并不理想,但有点不清楚为什么你需要调用活动开始,至少这会给你一些想法。

便携式方面:

public class Class1
{
    public static async Task<string> Fetch(string url, Action onComplete = null)
    {
        await Task.Delay(10);


        onComplete?.Invoke();
        return url;
    }
}

在Android方面(如果您的目的是在主屏幕出现之前进行此操作,这将是您的启动画面或应用程序):

[Activity(Label = "App5", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        Class1.Fetch("test", () =>
        {
            var intent = new Intent(this, typeof(OtherActivity));
            this.RunOnUiThread(() => StartActivity(intent));
        }).ContinueWith(t =>
        {
            if (t.IsCompleted) Log.Debug("Fetch", t.Result);
        });
    }
}

答案 1 :(得分:0)

  

我需要启动&#34; Weather.Droid&#34;的MainActivity。来自方法:

     

public async Task FetchAsync(string url)

您无法直接从Droid项目启动MainActivity。但正如@SKall所说,您可以在Action<Intent>方法中使用FetchAsync

//add Action<Intent> as and Intent as parameters
public async Task<string> FetchAsync(string url,Action<Intent> navigationFunc,Intent intent)
{
    string jsonString;
    ...
    navigationFunc(intent);//Invoke the action
    return jsonString;
}

然后在Droid项目中使用它:

ParsingClass parsing = new ParsingClass();
Intent intent = new Intent(this, typeof(MainActivity));
await parsing.FetchAsync("url", StartActivity, intent);