Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将方法转换为异步方法的帮助_Java_Android_Eclipse_Asynchronous_Methods - Fatal编程技术网

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-是的,我搞砸了重构。我想我修好了。既然你接受了它作为答案,也许你自己就能解决?