2016-12-04 3 views
1

Я работаю в приложении погоды для Android и windows-phone. Поэтому я пишу общий код в другом проекте в «Weather.Api (Portable)» в «Parsing Class». «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; } 
} 

}

мне нужно начать MainActivity из "Weather.Droid" от метода:

общественного асинхронной Task FetchAsync (строки url)

до этого r eturns:

jsonString

Как я могу это сделать?

ответ

0

мне нужно начать MainActivity из "Weather.Droid" от метода:

общественного асинхронной Task FetchAsync (строка URL)

Вы не можете напрямую запустить MainActivity из проекта Droid. Но, как сказал @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); 
+0

Intent находится в пространстве имен Android, поэтому вы не можете его использовать. Просто создайте простое действие. – SKall

+0

Это работает! Спасибо вам всем, ребята! –

1

Кажется, что вы находитесь после инъекции зависимостей. Объявить интерфейс в переносном проекте, а затем реализовать его в Droid/iOS/??? проекты, которые вы поддерживаете.

Я создал абстракцию МОК в проекте сообщества XLabs. Мэтт Уиттон написал несколько хороших инструкций о том, как его использовать: 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? Если это так, вы можете добавить действие к параметрам метода и вызвать его до возвращения метода. Если нет, то МОК - ваш лучший вариант. – SKall

+0

Я написал открытый метод, который начинает необходимую деятельность в проекте android. Но проблема заключалась в том, чтобы назвать этот метод проектом Weather.Api. Я попытался сделать ссылку. Но этого было невозможно. Текст этой ошибки: Ссылка Weather.Droid не может быть добавлена.Добавление этого проекта в качестве ссылки приведет к циклической зависимости –

 Смежные вопросы

  • Нет связанных вопросов^_^