MapView不会使异步任务的onProgressUpdated无效

时间:2014-04-11 11:23:47

标签: android asynchronous android-asynctask android-mapview osmdroid

我正在使用OSMdroid Mapview并使用AsyncTask类来获取一些数据,我创建叠加层并尝试每次获取一个msg时重绘。

不幸的是,我能够从客户端获取数据并且我能够在onProgressUpdated中创建叠加层,我甚至调用invalidate();但似乎没有任何事情发生。不确定是什么问题?

这是我的AsyncTask

public class TaskManager extends AsyncTask<Void, GeoPoint, Void>{

    .....

    public TaskManager(Master master,MapView mapview) {
       //Construtor
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        if(Constance.TCPIP) {
            Log.d("APP","Inside TCPIP");
            //Creation of TCPIP Sockets
            try {
                m_ssocket = new ServerSocket(Constance.PORT_NO);
                Log.d("APP","ServerSocket: "+m_ssocket);
                m_socket = m_ssocket.accept();
                Log.d("APP","Accepted: "+m_socket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        else if (Constance.UDPIP) {         

            //Creation of UDP Sockets
            try {
                m_dsocket = new DatagramSocket(Constance.PORT_NO);
            } catch (SocketException e) {
                e.printStackTrace();
            }
        }
        else if (Constance.MCUDP) {

            //Lock Wifi multicast
            mMultiCastLock = new MultiCastLock(mMaster.getBaseContext());
            mMultiCastLock.setMultiCastAcquire();

            //Creation of MC-UDP Sockets
            try {
                m_mcsocket = new MulticastSocket(Constance.PORT_NO);
                InetAddress address = InetAddress.getByName(Constance.GROUP_ADDR);
                m_mcsocket.joinGroup(address);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // Create a buffer to read datagrams into.
        byte[] mSocketbuffer = new byte[Constance.DGRAM_LEN];

        if(Constance.TCPIP) {
            try {
                m_inSocketData = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
                Log.d("APP","Reading");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {            
            // Create a packet to receive data into the buffer
            m_inPacket = new DatagramPacket(mSocketbuffer, mSocketbuffer.length);
        }

        //prepare overlay items
        prepareItemizedOverlay();

        // Now loop forever, waiting to receive packets and printing them.
        if(m_ssocket!=null || m_dsocket!=null || m_mcsocket!=null)
        while (true) {

        if (isCancelled())  break;

            //Get Data
            parseData();

            //Make Packet Object
            if(mMSG!=null) {
                make(mMSG);
            }

            if(m_inPacket!=null && !Constance.TCPIP) {
                // Reset the length of the packet before reusing it.
                m_inPacket.setLength(mSocketbuffer.length);
            }
        }


        return null;
    }

    @Override
    protected void onProgressUpdate(GeoPoint... geoPoints){

    OverlayItem overlayItem = new OverlayItem("Name", "Description", geoPoints[0]);
            mItemizedOverlay.addOverlay(overlayItem);
            mMapView.getOverlays().add(mItemizedOverlay);
            mMapView.getController().animateTo(geoPoints[0]);

        mMapView.invalidate();  

    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        if(Constance.TCPIP) {
            if(m_ssocket!=null && m_socket!=null){
                try {
                    m_ssocket.close();
                    m_socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else if(Constance.UDPIP) {
            if(m_dsocket!=null)
                m_dsocket.close();
        } else if(Constance.MCUDP) {
            if(m_mcsocket!=null)
                m_mcsocket.close();
        }
        Log.d("APP","Task Ended");
    }

    private void parseData() {

        if(Constance.TCPIP) {
            // Wait to receive a socket data
            try{
                mMSG = m_inSocketData.readLine();

            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            // Wait to receive a datagram
            try {
                m_dsocket.receive(m_inPacket);
                // Convert the contents to a string, and display them
            } catch (IOException e) {
                e.printStackTrace();
                }
        }       
    }

    private void make(String plot) {


            //Make Object
            mMSG = new MSG(plot);

            //Overlay
            mGeoPoint = mMSG.getGeoPoint();
            publishProgress(mMSG.getGeoPoint());

    }

    private void prepareItemizedOverlay() {
        /*  itemized overlay */
        Drawable newMarker = mMaster.getResources().getDrawable(R.drawable.ic_sensor);
        mItemizedOverlay = new PlotItemOverlay(mMaster,mItemList,newMarker,
              new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {

              @Override
              public boolean onItemSingleTapUp(int index, OverlayItem item) {
                Log.d("APP","HERE");
                return true;
              }

              @Override
              public boolean onItemLongPress(int index, OverlayItem item) {

                  return true;
              }
          }, mResourceProxy);

    }    
}

一切似乎都有效,但似乎没有任何事情发生,不确定是什么问题?

1 个答案:

答案 0 :(得分:0)

终于解决了。我实际上正在替换我的MapFragment类,导致所有这些Object的丢失,并且创建的新对象与旧的对象接口,因此接收的数据与旧的MapFragment接口而不是新的MapFragment。一旦我发现逻辑分析代码,就解决了。无论如何,感谢@kurtzmarc的支持,你一直非常乐于助人。我将继续使用OSMdroid来查看我提出的更多内容。