2016-12-04 98 views
1

我正在为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从方法:

公共异步任务FetchAsync(串url)

它之前r eturns:

jsonString

我怎样才能做到这一点?

回答

0

我需要从方法来启动 “Weather.Droid” 的MainActivity:

公共异步任务FetchAsync(字符串URL)

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

//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); 
+0

Intent位于Android命名空间中,因此您不能使用它。只需创建一个简单的动作。 – SKall

+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); 
     }); 
    } 
} 
+0

我只想从ParsingClass调用被放置在Weater任何方法.Droid项目。这是我的问题。 –

+0

你是从Android项目调用这个方法吗?如果是这样,您可以将Action添加到方法参数并在方法返回之前调用它。如果不是那么国际奥委会是你最好的选择。 – SKall

+0

我写了公开的方法,在Android项目中启动需要的活动。但问题是从Weather.Api项目调用此方法。我试图做一个参考。但这是不可能的。该错误的文本是:无法添加引用Weather.roid。添加这个项目作为参考会导致循环依赖 –