我需要使用位图图像作为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
}
};
答案 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);