سؤال

أنا استخدم OSMdroid Mapview واستخدام AsyncTask class للحصول على بعض البيانات، وأقوم بإنشاء تراكبات وأحاول إعادة الرسم في كل مرة أتلقى فيها رسالة.

لسوء الحظ، أنا قادر على الحصول على البيانات من العميل وأستطيع إنشاء تراكبات لها 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);

    }    
}

يبدو أن كل شيء يعمل، ولكن يبدو أن لا شيء يحدث، لست متأكدا ما هي المشكلة؟

هل كانت مفيدة؟

المحلول

وأخيرا حلها.كنت في الواقع أستبدل فئة MapFragment الخاصة بي مما أدى إلى فقدان كل هذا الكائن وكان الكائن الجديد الذي تم إنشاؤه يتصل بالكائن القديم، وبالتالي فإن البيانات المستلمة تتفاعل مع MapFragment الأقدم وليس MapFragment الجديد.لقد تم حلها، بمجرد أن وجدت التحليل المنطقي للكود.على أي حال، شكرًا على دعم @kurtzmarc، لقد كنت مفيدًا للغاية حتى الآن.سأستمر بنفس الأمر مع OSMdroid لرؤية المزيد من الأشياء التي أتوصل إليها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top