【问题标题】:Use an Async task for a bitmap对位图使用异步任务
【发布时间】:2014-01-11 11:44:23
【问题描述】:

我有一种方法可以将许多标记添加到 Google 地图。

这是我的代码:

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);

我收到此错误:

引发了“Android.OS.NetworkOnMainThreadException”类型的异常。

我做了一些研究,我认为我需要在获取位图时在另一个线程上运行该操作。

我可以就这段代码寻求帮助吗? AsyncTask 是否返回 Bitmap,或者我如何将两者结合在一起?

提前致谢。

编辑

我正在使用 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);
            }
        }
    }
}

我遇到了很多错误。我是否将此代码放置在正确的区域?

【问题讨论】:

  • 在安卓文档中搜索异步任务..
  • 这里没有错误。请在活动中显示您的代码。我认为问题在于那个。
  • @Overrideextends 是 Java 单词。在 C# 中,您需要更改它们,例如override 在声明中并使用 :。或者,您可以查看此Async Support Overview in Xamarin

标签: android url bitmap android-asynctask xamarin


【解决方案1】:

在AsyncTask的doInBackground中获取输入流如:

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");

【讨论】:

    【解决方案2】:

    当您创建从AsyncTask 派生的类时,您必须指定3 个通用参数:Params、Progress、Result 和Override doInBackground 函数。这个函数的签名是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");
    

    【讨论】:

    • 对不起,我没有意识到你在使用 xamarin,这段代码是 java
    【解决方案3】:

    AsyncTask 用于在后台执行任务,任何任务,不会阻碍或阻碍主 UI 线程。它提供了三种有用的方法,(其中包括)调整操作。

    1. onPreExecute:在执行主要工作之前准备好你的东西,比如显示加载图标。
    2. doInBackground:执行实际任务,例如基于网络的操作或繁重的计算。
    3. onPostExecute:在后台操作完成时调用此方法,您现在可以安全地更新 UI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多