Java 将方法转换为异步方法的帮助
我正在尝试将应用程序中的方法转换为异步方法。这是一种在谷歌地图视图上加载大量自定义标记的方法。我需要使其异步,以便在加载标记时立即显示视图 有人能帮我指点一下如何将下面的方法转换成异步方法吗?我正在努力理解这个概念。多谢各位Java 将方法转换为异步方法的帮助,java,android,eclipse,asynchronous,methods,Java,Android,Eclipse,Asynchronous,Methods,我正在尝试将应用程序中的方法转换为异步方法。这是一种在谷歌地图视图上加载大量自定义标记的方法。我需要使其异步,以便在加载标记时立即显示视图 有人能帮我指点一下如何将下面的方法转换成异步方法吗?我正在努力理解这个概念。多谢各位 private void showpins() throws IOException { SQLiteDatabase db = mDbHelper.getReadableDatabase(); Cursor mCursor = db.query(TAB
private void showpins() throws IOException {
SQLiteDatabase db = mDbHelper.getReadableDatabase();
Cursor mCursor = db.query(TABLE_NAME, null, null, null, null, null, null);
startManagingCursor(mCursor);
while (mCursor.moveToNext()) {
Address = mCursor.getString(4);
Name = mCursor.getString(0);
String noSpaces = Address.replaceAll(" ", "+");
JSONObject geocoded = getLocationInfo(noSpaces);
GeoPoint point = getGeoPoint(geocoded);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.pushpin);
CustomizedItemOverlay itemizedOverlay =
new CustomizedItemOverlay(drawable, this);
OverlayItem overlayitem =
new OverlayItem(point, Name, Address);
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
}
}
不久前我也做过类似的事情。然而,它有为每个图像创建一个新线程的问题,因此最终崩溃。这对我来说是必要的,但如果你不是从互联网上获取图像,你应该可以不用它。这是密码-
/**
*
* @author Kyle
*/
public class HelloItemizedOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
super(boundCenterBottom(defaultMarker));
populate();
mContext = context;
}
@Override
public boolean onTouchEvent(MotionEvent event, final MapView mapView) {
//---when user lifts his finger---
if (event.getAction() == MotionEvent.ACTION_UP) {
new Thread(new Runnable() {
public void run() {
ArrayList db = MainActivity.getDB(mContext);
int i=0;
for (Object o : db) {
if(i>40)break;
final ArrayList list = ((ArrayList) o);
final int lon = (int) ((Double.parseDouble("" + list.get(1)) * 1000000.0) + .5);
final int lat = (int) ((Double.parseDouble("" + list.get(2)) * 1000000.0) + .5);
final GeoPoint point = new GeoPoint(lat, lon);
if (isCurrentLocationVisible(mapView, point)) {
Log.i("***", "POINT IS VISIBLE");
if (mOverlays.size() > 40) {
i++;
Log.i("***", i+"");
removeOverlay(0);
}
if (lat != 0) {
Thread t=new Thread(new Runnable() {
public void run() {
final OverlayItem overlayitem = new OverlayItem(point, "" + lat + " " + lon, list.get(0).toString().replace("jpg", "mjpg").replace("image", "video"));
final String url = list.get(0).toString().replace("mjpg", "jpg").replace("video", "image");
Drawable d = MainActivity.getImage(url);
if (d != null) {
d.setBounds(0, 0, 48, 32);
overlayitem.setMarker(d);
addOverlay(overlayitem);
mapView.postInvalidate();
}
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
} else {
Log.i("***", "POINT IS OUTSIDE VISIBLE RECT");
}
}
}
}).start();
}
return false;
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
public void removeOverlay(int index) {
try {
mOverlays.remove(index);
} catch (Exception e) {
Log.e("***", e.toString());
}
populate();
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
return true;
}
}
主要活动是什么-
public class MainActivity extends MapActivity {
public static final String mapsApi = "xxxxxxxxxxxxxxxxxx";
public static final String PREFS_NAME = "CamWorldPrefsFile";
ListView myListView = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
final MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(false);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.cam);
// d.setBounds(0, 0, d.getIntrinsicWidth()-50, d.getIntrinsicHeight());
final HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);
final DataBaseHelper myDbHelper = new DataBaseHelper(this.getApplicationContext());
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
new Thread(new Runnable() {
public void run() {
try {
//myDbHelper.close();
myDbHelper.openDataBase();
String query = "SELECT * from database;";
ArrayList stringList = myDbHelper.selectRecordsFromDBList(query, null);
myDbHelper.close();
for (int i = 0; i < stringList.size() - 1; i++) {
final ArrayList list = (ArrayList) stringList.get(i);
try {
if (Double.parseDouble("" + list.get(1)) != 0) {
Log.i("***", list.get(0).toString().replace("mjpg", "jpg").replace("video", "image"));
// Log.i("***", list.get(2) + " : ");
// Log.i("***", list.get(3) + " : ");
final int lon = (int) ((Double.parseDouble("" + list.get(1)) * 1000000.0) + .5);
final int lat = (int) ((Double.parseDouble("" + list.get(2)) * 1000000.0) + .5);
final GeoPoint point = new GeoPoint(lat, lon);
if (lat != 0) {
Thread t = new Thread(new Runnable() {
public void run() {
final OverlayItem overlayitem = new OverlayItem(point, "" + lat + " " + lon, list.get(0).toString().replace("jpg", "mjpg").replace("image", "video"));
final String url = list.get(0).toString().replace("mjpg", "jpg").replace("video", "image");
Drawable d = MainActivity.getImage(url);
if (d != null) {
d.setBounds(0, 0, 48, 32);
overlayitem.setMarker(d);
itemizedoverlay.addOverlay(overlayitem);
}
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
// ("http://151cam.uoregon.edu/axis-cgi/jpg/image.cgi?resolution=160x120")
}
} catch (Exception e) {
Log.i("***", e.getMessage());
}
}
// mapView.invalidate();
} catch (SQLException sqle) {
throw sqle;
}
}
}).start();
mapOverlays.add(itemizedoverlay);
我不确定您发布的方法调用的所有方法都做了些什么,但我假设只有对mapOverlays的调用会影响UI,其他一切都可能发生在后台。您可以将其转换为类似这样的异步任务这最好作为一个内部类,我认为:
class OverlayLoader extends AsyncTask<Void, CustomizedItemOverlay, Void> {
List<Overlay> mapOverlays;
@Override
protected onPreExecute() {
mapOverlays = mapView.getOverlays();
}
@Override
protected Void doInBackground(Void... params) {
SQLiteDatabase db = mDbHelper.getReadableDatabase();
Cursor mCursor = db.query(TABLE_NAME, null, null, null, null, null, null);
startManagingCursor(mCursor);
while (mCursor.moveToNext()) {
Address = mCursor.getString(4);
Name = mCursor.getString(0);
String noSpaces = Address.replaceAll(" ", "+");
JSONObject geocoded = getLocationInfo(noSpaces);
GeoPoint point = getGeoPoint(geocoded);
Drawable drawable = this.getResources().getDrawable(R.drawable.pushpin);
CustomizedItemOverlay itemizedOverlay =
new CustomizedItemOverlay(drawable, this);
CustomizedItemOverlay overlayitem = new OverlayItem(point, Name, Address);
itemizedOverlay.addOverlay(overlayItem);
publishProgress(overlayitem);
}
}
@Override
protected void onPublishProgress(CustomizedItemOverlay... overlayItem) {
mapOverlays.add(itemizedOverlay);
}
}
在您的方法中花费的大部分时间在哪里?占用时间最多的是getLocationInfo和getGeoPoint调用还是SQLiteDatabase访问?嗨,Paul。它将位于getLocationInfo中,因为JSON例程在这里从Google获取位置信息。谢谢。那么,我是否要删除showpins方法并用上面的类替换它?或者我要为此类创建一个新的类文件吗?@Ohnomycoco-是的,您将删除showpins方法,并用新的OverlayLoader.execute;替换对showpins的调用;。我在最后几行代码中遇到了一些编译器错误:CustomizeEditeMoverlay overlayitem=新的OverlayItempoint、Name、Address;publishProgressoverlayitem;}}@在PublishProgressCustomizeEditomOverlay上覆盖受保护的无效。。。overlayItem{itemizedOverlay.addOverlayoverlayItem;}}}1 onPublishProgress无法解析逐项覆盖2 onPublish progress方法必须重写或实现超类型方法3类型不匹配-无法从overlayItem转换为CustomizedEditeMoverlay。@Ohnomycoco-是的,我搞砸了重构。我想我修好了。既然你接受了它作为答案,也许你自己就能解决?