如何从AsyncTask类获取doInBackground()返回的值

时间:2015-04-23 15:56:13

标签: android bitmap android-asynctask

我需要使用位图图像作为Marker.icon。

我有2个AsyncTask类,MyTask和BitmapTask,第一个使用值{double,double,string,string = url of my bitmap icon}检索JSONArray,第二个使用最后一个JSONArray字符串(换句话说) url)作为参数获取位图图标。

尝试以这种方式失败:

MyTask类

      public class MyTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
    //          updateDisplay("Starting task");

        //tasks.add(this);
    }

    @Override
    protected String doInBackground(String... params) {

        String content = HttpManager.getData(params[0]);
        return content;
    }


  @Override
  protected void onPostExecute(String result) {
       double  JsonLat = 0.0  ;
       double  Jsonlong = 0.0 ;
       String  JsonName = "" ;
       String  JsonIconurl = "" ;
       Bitmap  JsonIcon = null;



        try {

            JSONArray cast = new JSONArray(result);
            BitmapTask icontask = new BitmapTask();
            for (int i=0; i<cast.length(); i++) {

                JSONObject Marker = new JSONObject(cast.get(i).toString());
                stringJsonLat = Marker.getString("latitude");
                stringJsonLng = Marker.getString("longitude");
                Jsonlong = Double.parseDouble(stringJsonLng);
                JsonLat = Double.parseDouble(stringJsonLat);
                JsonName = Marker.get("title").toString();
                JsonIconurl = Marker.get("icone").toString();

                 icontask.execute(JsonIconurl);
                 JsonIcon = icontask.doInBackground();

                if (InArea(JsonLat,Jsonlong)) {
                    mMap.addMarker(new MarkerOptions().position(new LatLng(JsonLat,Jsonlong)).title(JsonName).icon(BitmapDescriptorFactory.fromBitmap(JsonIcon)));

                }

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void onProgressUpdate(String... values) {
    //          updateDisplay(values[0]);
    }

}

BitmapTask类

 public class BitmapTask extends AsyncTask<String, Void, Bitmap>{
    @Override
    protected Bitmap doInBackground(String... params) {
        Bitmap bmImg = null;
        try {
            URL url = new URL(params[0]);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bmImg = BitmapFactory.decodeStream(is);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            bmImg = null;
        }

        return bmImg;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        // TODO: do what you need with resulting bitmap - add marker to map
    }
};

3 个答案:

答案 0 :(得分:0)

运行MyTask AsyncTask,在MyTask类的onPostExecute中运行BitmapTask AsyncTask。

  

MyTask的onPostExecute

@Override
protected void onPostExecute(String result) {
     new BitmapTask().execute(params);   //params if any
}

答案 1 :(得分:0)

BitmapTask课程中,请添加以下内容:

public interface BitmapTaskListener{
    public void onResult(Bitmap bmImg);
}

private BitmapTaskListener bitmapListener;

public void setBitmapListener (BitmapTaskListener listener){
    bitmapListener = listener;
}

当然,您不必使用相同的名称。您的onPostExecute应为:

@Override
protected void onPostExecute(Bitmap result) {
    if (bitmapListener!=null)
        bitmapListener.onResult(result);
}

最后,您应该使用setBitmapListener来设置监听器。您必须实现方法onResult,您可以使用您获得的位图执行任何操作。

编辑:实际上,您正在BitmapTask内拨打MyTask。您可以传播监听器,或者我建议从UI中的第一个任务获取结果,然后从那里初始化第二个任务。

另外,不要这样:JsonIcon = icontask.doInBackground();doInBackground之后会在内部调用onPreExecute。您应该只通过task.execute(params)

启动任务

答案 2 :(得分:0)

我建议在一个AsyncTask中进行所有下载操作(下载JSON字符串和图标)。

您需要有一个类来包装下载结果:

包装类:

private class JSONMarkerObject {
    double lat = 0.0;
    double lng = 0.0;
    String name = "";
    String iconURL = "";
    Bitmap iconBitmap = null;
}

帮助程序功能:

private ArrayList<JSONMarkerObject> parseJSON(String content) {

    ArrayList<JSONMarkerObject> markers = new ArrayList<MainActivity.JSONMarkerObject>();
    try {
        JSONArray array = new JSONArray(content);
        for (int i = 0; i < array.length(); i++) {
            JSONObject Marker = array.getJSONObject(i);
            JSONMarkerObject obj = new JSONMarkerObject();

            obj.lat = Double.parseDouble(Marker.getString("latitude"));
            obj.lng = Double.parseDouble(Marker.getString("longitude"));
            obj.name = Marker.getString("title");
            obj.iconURL = Marker.getString("icone");
            obj.iconBitmap = downloadIcon(obj.iconURL);
            markers.add(obj);
        }

    } catch (NumberFormatException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return markers;

}

private Bitmap downloadIcon(String iconURL) {
    Bitmap bmImg = null;
    try {
        URL url = new URL(iconURL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream is = conn.getInputStream();
        bmImg = BitmapFactory.decodeStream(is);
    } catch (IOException e) {
        e.printStackTrace();
        bmImg = null;
    }

    return bmImg;
}

下载任务:

public class MyTask extends AsyncTask<String, String, ArrayList<JSONMarkerObject>> {

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected ArrayList<JSONMarkerObject> doInBackground(String... params) {

        String content = HttpManager.getData(params[0]);
        ArrayList<JSONMarkerObject> markers = parseJSON(content);
        return markers;
    }

    @Override
    protected void onPostExecute(ArrayList<JSONMarkerObject> result) {

        try {

            for (int i = 0; i < result.size(); i++) {

                JSONMarkerObject obj = result.get(i);

                if (InArea(obj.lat, obj.lng)) {
                    mMap.addMarker(new MarkerOptions().position(new LatLng(obj.lat, obj.lng)).title(obj.name)
                            .icon(BitmapDescriptorFactory.fromBitmap(obj.iconBitmap)));

                }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onProgressUpdate(String... values) {
        // updateDisplay(values[0]);
    }

}

我认为不需要先在一个任务中下载文本,然后在另一个任务中下载图标,因为下载图标时标记会出现在地图上,因此下载所有内容都没有问题一枪。

修改

  

添加信息窗口的最简单方法是设置标题()和   相应标记的snippet()方法。

mMap.addMarker(new MarkerOptions()
.position(new LatLng(obj.lat, obj.lng))
.title(obj.name)
.icon(BitmapDescriptorFactory.fromBitmap(obj.iconBitmap)))
.setTitle(obj.name)
.snippet(obj.name);