2014-01-11 3 views
1

У меня есть метод, который добавляет много маркеров в карту Google.Использовать задачу Async для растрового изображения

Вот мой код:

item = new MapLocation(); 
URL myurl = new URL("http://www.canninginc.co.nz/CanFindLocation/yes.png"); 
Bitmap bmp = BitmapFactory.DecodeStream(myurl.OpenConnection().InputStream); 
item.icon = BitmapDescriptorFactory.FromBitmap(bmp); 
item.Location = new LatLng (-41.227834, 174.812857); 
item.Snippet = "Snippet2"; 
item.Title = "Title2"; 
item.ShowInfoWindowOnStartup = true; 
_mapLocationList.Add(item); 

Я получаю эту ошибку:

Exception of type 'Android.OS.NetworkOnMainThreadException' was thrown.

Я сделал некоторые исследования, и я думаю, что нужно выполнить действие в другом потоке при получении Bitmap ,

Могу ли я помочь с этим кодом? Возвращает ли AsyncTask растровое изображение или как связать их вместе?

Заранее спасибо.

EDIT

Я использую Xamarin, и опубликовали следующий код в новый класс:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Graphics; 

namespace SimpleMapDemo 
{ 
    class MyAsyncTask extends AsyncTask<String, Void, Bitmap> 
    { 
     @Override 
     protected Bitmap doInBackground(String... urls) { 
      if (urls.length > 0) { 
       URL myurl = new URL("http://www.canninginc.co.nz/CanFindLocation/yes.png"); 
       return BitmapFactory.DecodeStream(myurl.OpenConnection().InputStream); 
      } 

      return null; 
     } 
     @Override 
     protected void onPostExecute(Bitmap bmp) { 
      super.onPostExecute(bmp); 

      if (bmp != null) { 
       item = new MapLocation(); 
       item.icon = BitmapDescriptorFactory.FromBitmap(bmp); 
       item.Location = new LatLng (-41.227834, 174.812857); 
       item.Snippet = "Snippet2"; 
       item.Title = "Title2"; 
       item.ShowInfoWindowOnStartup = true; 
       _mapLocationList.Add(item); 
      } 
     } 
    } 
} 

Я получаю много ошибок. Я помещаю этот код в правильную область?

+0

Поиск задачи async в документации по android .. –

+0

Здесь нет ошибки. Пожалуйста, покажите свой код в действии. Я думаю, что проблема в этом. – Luc

+0

'@ Override' и' extends' - это слова Java. В C# вам необходимо изменить их, например. 'переопределить' в декларации и использовать': '. Или, альтернативно, вы можете посмотреть на это [Обзор поддержки Async в Xamarin] (http://docs.xamarin.com/guides/cross-platform/advanced/async_support_overview/) – sujoy

ответ

0

AsyncTask используется для выполнения задачи, любые задачи, в фона, не препятствуя или не сдерживая основной поток пользовательского интерфейса. Он содержит три полезных метода (среди прочих) для настройки операции.

  1. onPreExecute: подготовить материал, прежде чем выполнять основную работу, например показать значок загрузки.
  2. doInBackground: для выполнения реальной задачи, например, для работы на основе сети или для тяжелых вычислений.
  3. onPostExecute: этот метод вызывается, когда выполняется фоновая операция, и теперь вы можете безопасно обновлять интерфейс.
4

Получить входной поток в doInBackground из AsyncTask нравится:

private class LoadImage extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected String doInBackground(String... params) { 
     URL myurl = new URL("http://www.canninginc.co.nz/CanFindLocation/yes.png"); 
     Bitmap bmp = BitmapFactory.DecodeStream(myurl.OpenConnection().InputStream); 
     return bmp; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     item.icon = BitmapDescriptorFactory.FromBitmap(bmp); 
     item.Location = new LatLng (-41.227834, 174.812857); 
     item.Snippet = "Snippet2"; 
     item.Title = "Title2"; 
     item.ShowInfoWindowOnStartup = true; 
     _mapLocationList.Add(item); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 

И

new LoadImage().execute(); 

Вы также можете установить URL изображения динамически:

private class LoadImage extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected String doInBackground(String... params) { 
     URL myurl = new URL(params[0]); 
     Bitmap bmp = BitmapFactory.DecodeStream(myurl.OpenConnection().InputStream); 
     return bmp; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     item.icon = BitmapDescriptorFactory.FromBitmap(bmp); 
     item.Location = new LatLng (-41.227834, 174.812857); 
     item.Snippet = "Snippet2"; 
     item.Title = "Title2"; 
     item.ShowInfoWindowOnStartup = true; 
     _mapLocationList.Add(item); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 

И

new LoadImage().execute("http://www.canninginc.co.nz/CanFindLocation/yes.png"); 
1

При создании класса, полученного из AsyncTask, вам необходимо указать 3 общих параметра: Парамеры, Прогресс, Результат и OverridedoInBackground. Эта функция имеет подпись protected Result doInBackground(Params...).

Возвращаясь к вашему вопросу, который вы можете использовать что-то вроде этого:

class MyAsyncTask extends AsyncTask<String, Void, Bitmap> 
    @Override 
    protected Bitmap doInBackground(String... urls) { 
     if (urls.length > 0) { 
      URL myurl = new URL("http://www.canninginc.co.nz/CanFindLocation/yes.png"); 
      return BitmapFactory.DecodeStream(myurl.OpenConnection().InputStream); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bmp) { 
     super.onPostExecute(bmp); 

     if (bmp != null) { 
      item = new MapLocation(); 
      item.icon = BitmapDescriptorFactory.FromBitmap(bmp); 
      item.Location = new LatLng (-41.227834, 174.812857); 
      item.Snippet = "Snippet2"; 
      item.Title = "Title2"; 
      item.ShowInfoWindowOnStartup = true; 
      _mapLocationList.Add(item); 
     } 
    } 
} 

После этого вы можете назвать это так:

new MyAsyncTask().execute("http://www.canninginc.co.nz/CanFindLocation/yes.png"); 
+0

Можете ли вы посмотреть мое редактирование, пожалуйста? – user22707

+0

Извините, я не понимал, что вы используете xamarin, этот код java – pshegger

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