首页 > 解决方案 > 如何让后台任务在地图上移动标记

问题描述

在我的地图活动中,我有一个 AsyncTask 使用套接字与另一个程序进行通信并获取一些信息。根据该信息,我必须在地图上移动某些标记。这怎么可能?

如果我只是尝试直接从后台任务中使用 setPosition(),它就不起作用。

标记的移动与我无关,所有必要的列表、标记选项等都将被添加。问题是在哪里执行它们以便地图得到更新并且我可以看到标记在移动(将它们放在 onMapReady 中不起作用。该函数必须结束才能显示地图)。

这是后台任务:


class backTask extends AsyncTask<Void, Void, Void>
    {
        Consumer consumer;

        public backTask(Consumer c)
        {
            this.consumer = c;
        }

        @Override
        protected Void doInBackground(Void... voids)
        {
            String comm_info = consumer.Start();

            StringTokenizer tok = new StringTokenizer(comm_info, "+");
            int bro_port = Integer.parseInt(tok.nextToken());
            String bro_ip = tok.nextToken();

            //keep asking for updates
            Message question = new Message("update?");
            Message answer;

            try
            {
                while(true)
                {
                    Socket Con_sock = new Socket(InetAddress.getByName(bro_ip), bro_port);
                    ObjectOutputStream ask = new ObjectOutputStream(Con_sock.getOutputStream());
                    ObjectInputStream rep = new ObjectInputStream(Con_sock.getInputStream());


                    //asking
                    ask.writeObject(question);
                    ask.flush();

                    //get response
                    answer = (Message) rep.readObject();
                    if (answer.type == 2)
                    {
                        //No update
                    }
                    else if (answer.type == 0)
                    {
                        //got update
                        //move / create markers here
                    }
                    Thread.sleep(500);
                }//loop
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

    }//backTask END
}

和 onMapReady 方法:

public void onMapReady(GoogleMap googleMap)
    {
        mMap = googleMap;

        LatLng athens = new LatLng(37.93, 23.731960);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(athens));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(13));

        Consumer con = (Consumer)getIntent().getExtras().get("Consumer");
        backTask BT = new backTask(con);
        BT.execute();
}

标签: javaandroidgoogle-maps

解决方案


推荐阅读