Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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 跳过1492帧!应用程序可能在其主线程上做了太多的工作。如何在跳过应用程序中的帧时显示加载程序?_Java_Android_Google Maps_Asynchronous_Progressdialog - Fatal编程技术网

Java 跳过1492帧!应用程序可能在其主线程上做了太多的工作。如何在跳过应用程序中的帧时显示加载程序?

Java 跳过1492帧!应用程序可能在其主线程上做了太多的工作。如何在跳过应用程序中的帧时显示加载程序?,java,android,google-maps,asynchronous,progressdialog,Java,Android,Google Maps,Asynchronous,Progressdialog,由于我是android新手,无法解决跳过1000多帧的问题。请帮助我解决此问题,并在打开地图之前执行此跳过帧操作时,帮助我添加加载进度条。这是我的地图代码 RouteMap.java public class RouteMap extends android.support.v4.app.FragmentActivity implements OnClickListener, OnInfoWindowClickListener, DirecitonReceived

由于我是android新手,无法解决跳过1000多帧的问题。请帮助我解决此问题,并在打开地图之前执行此跳过帧操作时,帮助我添加加载进度条。这是我的地图代码

RouteMap.java

public class RouteMap extends android.support.v4.app.FragmentActivity
        implements OnClickListener, OnInfoWindowClickListener,
        DirecitonReceivedListener, OnMapReadyCallback {
    public List<String> destinations;
    ImageView img_home, img_menu;
    private GoogleMap mMap;
    ProgressDialog prgDialog;
    model modelData;
    private Button btnDirection;
    double latitude, longitude;
    LinearLayout linear_back;
    LatLng startPosition, start;
    String startPositionTitle;
    Vibrator vibrator;
    String startPositionSnippet;
    Double desc1_long, desc1_lat;
    LatLng destinationPosition1;
    String destinationPositionTitle;
    String destinationPositionSnippet;
    MarkerOptions mDestination1, mStart;
    ToggleButton tbMode;
    GPSTracker gps;
    Geocoder gCoder;
    ArrayList<Address> addresses = null;
    ArrayList<Address> adres2 = null;
    SupportMapFragment mapFragment;
    public final static double AVERAGE_RADIUS_OF_EARTH = 6371;
    TextView back_txt;
    openMap openMap;
    String mapStatus = "start";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_route_map);
        back_txt = (TextView) findViewById(R.id.txt_back);

        try {
            back_txt = (TextView) findViewById(R.id.txt_back);
            modelData = model.getInstance();
            vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
            gps = new GPSTracker(RouteMap.this);
            latitude = gps.getLatitude();
            longitude = gps.getLongitude();
            gCoder = new Geocoder(RouteMap.this);
            addresses = (ArrayList<Address>) gCoder.getFromLocation(latitude, longitude, 1);

            tbMode = (ToggleButton) findViewById(R.id.tbMode);
            mapFragment = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map));
            mapFragment.getMapAsync(this);
            btnDirection = (Button) findViewById(R.id.btnDirection);
            btnDirection.setOnClickListener(this);
            tbMode.setChecked(true);

        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "Please Check your Data connection or Turn on your Location", Toast.LENGTH_LONG).show();
        }

    }

    public int calculateDistance(double userLat, double userLng, double venueLat, double venueLng) {

        final int R = 6371;
        try {
            Double latDistance = deg2rad(venueLat - userLat);
            Double lonDistance = deg2rad(venueLng - userLng);
            Double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
                    + Math.cos(deg2rad(userLat)) * Math.cos(deg2rad(venueLat))
                    * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
            Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            double distance = R * c * 1000; // convert to meters

            double height = 0 - 0;
            distance = Math.pow(distance, 2) + Math.pow(height, 2);
            return (int) Math.sqrt(distance);
        } catch (Exception ex) {
            Toast.makeText(getApplicationContext(), "Please Check your Destination's GeoCode ", Toast.LENGTH_LONG).show();
        }
        return 0;
    }

    private double deg2rad(double deg) {return (deg * Math.PI / 180.0);}
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap=googleMap;
        //setUpMap();

        try {
            mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            mMap.setMyLocationEnabled(true);
            mMap.setIndoorEnabled(true);
            mMap.getUiSettings().setZoomControlsEnabled(true);
            mMap.getUiSettings().setMyLocationButtonEnabled(true);
            mMap.getUiSettings().setCompassEnabled(true);
            mMap.getUiSettings().setAllGesturesEnabled(true);

            String[] arr = new String[modelData.outletList.size()];

            for(int i=0;i<modelData.outletList.size();i++)
            {
                String str1 = modelData.outletList.get(i)[2];
                String str2 = modelData.outletList.get(i)[3];
                String newString = str1+","+str2;
                arr[i] = newString;
            }
            String[] latTempArr = arr;
            String strKey = "";
            double curLatitude = latitude;
            double curLongtitude = longitude;
            double desLat;
            double desLng;

            Map<String, Integer> final_arr = new HashMap<String, Integer>();
            Map<String, Integer> final_arr2 = new HashMap<String, Integer>();
            List<Integer> intTempArr = new ArrayList<Integer>();
            List<Integer> intTempArr2 = new ArrayList<Integer>();

            for(int j=0;j<arr.length;j++)
            {
                intTempArr =  new ArrayList<Integer>();
                for (int k=0;k<latTempArr.length;k++)
                {
                    String[] arr_temp = latTempArr[k].split(",");
                    //System.out.println(arr_temp[0]);
                    desLat = Double.parseDouble(arr_temp[0]);
                    desLng = Double.parseDouble(arr_temp[1]);
                    int temp = calculateDistance(curLatitude,curLongtitude,desLat,desLng);
                    intTempArr.add(temp);

                    final_arr.put(latTempArr[k],temp);
                }

                Collections.sort(intTempArr);

                Integer[] array = new Integer[intTempArr.size()];
                intTempArr.toArray(array);

                for (Map.Entry<String, Integer> entry : final_arr.entrySet()) {

                    try{
                        if (entry.getValue().equals(array[0])) { //get next best path

                            List<String> list = new ArrayList<String>(Arrays.asList(latTempArr)); // remove the best path to find next one
                            list.remove(entry.getKey());
                            latTempArr = list.toArray(new String[0]);

                            String[] arr_temp2 = entry.getKey().split(",");
                            //System.out.println(arr_temp[0]);
                            curLatitude = Double.parseDouble(arr_temp2[0]);
                            curLongtitude = Double.parseDouble(arr_temp2[1]);
                            strKey = entry.getKey();
                            intTempArr2.add(entry.getValue());
                            final_arr2.put(strKey,entry.getValue());
                        }
                    }
                    catch(Exception e)
                    {

                    }

                }
                //System.out.println(intTempArr);
            }

            //int i = 0;
            destinations = new ArrayList<String>();
            for(int i =0;i<intTempArr2.size();i++) {
                for(String Key : final_arr2.keySet()) {
                    //System.out.println();
                    if(final_arr2.get(Key) == intTempArr2.get(i)) {
                        destinations.add(Key);
                        break;
                    }
                }
            }

            System.out.println(destinations);
            for(int i = 0;i < destinations.size();i++) {
                //Toast.makeText(getApplicationContext(), " ListItem : " + i, Toast.LENGTH_LONG).show();
                String desti1 = destinations.get(i);
                String[] des = desti1.split(",");
                desc1_lat = Double.parseDouble(des[0]);
                desc1_long = Double.parseDouble(des[1]);

                startPosition = new LatLng(latitude, longitude);
                startPositionTitle = addresses.get(0).getLocality();
                startPositionSnippet = addresses.get(0).getAddressLine(1)+"," +" "+ addresses.get(0).getAddressLine(2);

                try {
                    adres2 = (ArrayList<Address>) gCoder.getFromLocation(desc1_lat, desc1_long, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                destinationPosition1 = new LatLng(desc1_lat, desc1_long);
                destinationPositionTitle = adres2.get(0).getLocality();
                destinationPositionSnippet =adres2.get(0).getAddressLine(1)+"," +" "+adres2.get(0).getAddressLine(2);
                // mMap.setOnInfoWindowClickListener(this);

                mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                    @Override
                    public View getInfoWindow(Marker marker) {
                        return null;
                    }

                    @Override
                    public View getInfoContents(Marker marker) {
                        View v = getLayoutInflater().inflate(R.layout.marker, null);

                        TextView info= (TextView) v.findViewById(R.id.info);

                        info.setText(marker.getSnippet().toString());

                        return v;
                    }
                });

                mDestination1 = new MarkerOptions()
                        .position(destinationPosition1)
                        .title(destinationPositionTitle)
                        .snippet(destinationPositionSnippet)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin1));

                mStart = new MarkerOptions()
                        .position(startPosition)
                        .title(startPositionTitle)
                        .snippet(startPositionSnippet)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin2));

                mMap.addMarker(mDestination1);
                mMap.addMarker(mStart);

                latitude = desc1_lat;
                longitude = desc1_long;
                LatLng locations = new LatLng(latitude,longitude);
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(locations, 5.5f));
            }
        }catch (Exception ex)
        {
            /*Toast.makeText(getApplicationContext(), "Please Check your Data connection or Turn on your Location", Toast.LENGTH_LONG).show();*/
        }

    }

    public void clearMap() {
        mMap.clear();
    }

    @Override
    public void onClick(View v) {
        try
        {
            Locale mLocale = new Locale("en");
            Log.d("Display language = ", "" + mLocale.getDisplayLanguage());


            gCoder = new Geocoder(RouteMap.this,mLocale);
            gps = new GPSTracker(RouteMap.this);
            latitude = gps.getLatitude();
            longitude = gps.getLongitude();


            for(int i = 0;i<destinations.size();i++) {
                String desti1 = destinations.get(i);
                String[] des = desti1.split(",");
                desc1_lat = Double.parseDouble(des[0]);
                desc1_long = Double.parseDouble(des[1]);

                startPosition = new LatLng(latitude, longitude);

                startPositionTitle = addresses.get(0).getLocality();
                startPositionSnippet = addresses.get(0).getAddressLine(1)+","+" "+addresses.get(0).getAddressLine(2);


                destinationPosition1 = new LatLng(desc1_lat, desc1_long);
                destinationPositionTitle = adres2.get(0).getLocality();
                destinationPositionSnippet =adres2.get(0).getAddressLine(1)+","+""+ adres2.get(0).getAddressLine(2);

                mMap.setOnInfoWindowClickListener(this);

                mStart = new MarkerOptions()
                        .position(startPosition)
                        .title(startPositionTitle)
                        .snippet(startPositionSnippet)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin1));

                mDestination1 = new MarkerOptions()
                        .position(destinationPosition1)
                        .title(destinationPositionTitle)
                        .snippet(destinationPositionSnippet)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin2));

                if (v == btnDirection) {
                    //  clearMap();

                    mMap.addMarker(mDestination1);
                    mMap.addMarker(mStart);

                    if (tbMode.isChecked()) {

                        new GetRotueListTask(RouteMap.this, startPosition,
                                destinationPosition1, GMapV2Direction.MODE_DRIVING, this)
                                .execute();

                    } else {
                        new GetRotueListTask(RouteMap.this, startPosition,
                                destinationPosition1, GMapV2Direction.MODE_WALKING, this)
                                .execute();
                    }
                }
                latitude = desc1_lat;
                longitude = desc1_long;



            }
        }catch (Exception ex)
        {
            Toast.makeText(getApplicationContext(), "Please Check your Data connection or Turn on your Location", Toast.LENGTH_LONG).show();
        }

    }

    @Override
    public void OnDirectionListReceived(List<LatLng> mPointList) {
        try
        {
            if (mPointList != null) {
                PolylineOptions rectLine = new PolylineOptions().width(10).color(
                        Color.RED);
                for (int i = 0; i < mPointList.size(); i++) {
                    rectLine.add(mPointList.get(i));
                }
                mMap.addPolyline(rectLine);

                gps = new GPSTracker(RouteMap.this);
                latitude = gps.getLatitude();
                longitude = gps.getLongitude();

                start = new LatLng(latitude, longitude);


                CameraPosition mCPFrom = new CameraPosition.Builder()
                        .target(start).zoom(15.5f).bearing(0).tilt(25)
                        .build();
                final CameraPosition mCPTo = new CameraPosition.Builder()
                        .target(destinationPosition1).zoom(15.5f).bearing(0)
                        .tilt(50).build();

                changeCamera(CameraUpdateFactory.newCameraPosition(mCPFrom),
                        new CancelableCallback() {
                            @Override
                            public void onFinish() {
                                changeCamera(CameraUpdateFactory
                                                .newCameraPosition(mCPTo),
                                        new CancelableCallback() {

                                            @Override
                                            public void onFinish() {

                                                LatLngBounds bounds = new LatLngBounds.Builder()
                                                        .include(start)
                                                        .include(
                                                                destinationPosition1)
                                                        .build();
                                                changeCamera(
                                                        CameraUpdateFactory
                                                                .newLatLngBounds(
                                                                        bounds, 50),
                                                        null, false);
                                            }

                                            @Override
                                            public void onCancel() {
                                            }
                                        }, false);
                            }

                            @Override
                            public void onCancel() {
                            }
                        }, true);
            }
        }catch (Exception ex)
        {
            Toast.makeText(getApplicationContext(), "Please Check your Data Connection", Toast.LENGTH_LONG).show();
        }

    }

    private void changeCamera(CameraUpdate update, CancelableCallback callback,
                              boolean instant) {

        if (instant) {
            mMap.animateCamera(update, 1, callback);
        } else {
            mMap.animateCamera(update, 4000, callback);
        }
    }


    @Override
    protected void onResume() {
        super.onResume();

    }

    @Override
    public void onInfoWindowClick(Marker marker) {

    }


    private class openMap extends AsyncTask<String, Void, String>
    {
        ProgressDialog mProgressDialog;
        Context ctx;
        public openMap(Context ctx)
        {
            this.ctx=ctx;
            mProgressDialog = new ProgressDialog(RouteMap.this);
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog.setMessage("Loading Map..Please wait....");
            mProgressDialog.setIndeterminate(true);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
            // Toast.makeText(getApplicationContext(), "Syncing DB...", Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(String... urls)
        {
            return "Success";
        }

        @Override
        protected void onPostExecute(String result)
        {
            mProgressDialog.dismiss();

            try
            {
                if(result.equalsIgnoreCase("Success")) {

                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Please Check your Data connection or Turn on your Location", Toast.LENGTH_LONG).show();
                }

            }catch (Exception e){}


        }
    }
}
公共类路由映射扩展了android.support.v4.app.FragmentActivity
实现OnClickListener、OnInfoWindowClickListener、,
DirecitonReceivedListener,在MapreadyCallback上{
公布目的地名单;
ImageView img_主页,img_菜单;
私有谷歌地图;
进程对话;
模型数据;
专用按钮b指示;
双纬度,经度;
线性布局-线性后向;
车床起动位置,起动;
字符串startPositionTitle;
振动器;
串起始位置接头;
双desc1_long,desc1_lat;
LatLng目的地位置1;
字符串destinationPositionTitle;
字符串destinationPositionSnippet;
标记选项mdestation1,mStart;
切换按钮tbMode;
全球定位系统;
地理编码器;
ArrayList地址=空;
ArrayList adres2=null;
SupportMapFragment-mapFragment;
公共最终静态双平均地球半径=6371;
TextView back_txt;
openMap-openMap;
字符串mapStatus=“开始”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u route\u map);
back_txt=(TextView)findViewById(R.id.txt_back);
试一试{
back_txt=(TextView)findViewById(R.id.txt_back);
modelData=model.getInstance();
可控震源=(可控震源)getApplicationContext().getSystemService(Context.可控震源\u服务);
gps=新的GP斯特拉克(RouteMap.this);
纬度=gps.getLatitude();
经度=gps.getLongitude();
gCoder=新地理编码器(RouteMap.this);
地址=(ArrayList)gCoder.getFromLocation(纬度,经度,1);
tbMode=(ToggleButton)findviewbyd(R.id.tbMode);
mapFragment=((SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map));
getMapAsync(这个);
btnDirection=(按钮)findViewById(R.id.btnDirection);
btnDirection.setOnClickListener(此);
tbMode.setChecked(true);
}捕获(IOE异常){
e、 printStackTrace();
Toast.makeText(getApplicationContext(),“请检查数据连接或打开位置”,Toast.LENGTH_LONG.show();
}
}
公共整数计算状态(双用户lat、双用户lng、双维纳lat、双维纳lng){
最终整数R=6371;
试一试{
双latDistance=deg2rad(venueLat-userLat);
双lonDistance=deg2rad(venueLng-用户LNG);
双a=Math.sin(latDistance/2)*Math.sin(latDistance/2)
+Math.cos(deg2rad(userLat))*Math.cos(deg2rad(venueLat))
*数学sin(lonDistance/2)*数学sin(lonDistance/2);
Double c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));
双距离=R*c*1000;//转换为米
双倍高度=0-0;
距离=数学功率(距离,2)+数学功率(高度,2);
return(int)Math.sqrt(distance);
}捕获(例外情况除外){
Toast.makeText(getApplicationContext(),“请检查目的地的地理代码”,Toast.LENGTH\u LONG.show();
}
返回0;
}
私有双deg2rad(双deg){return(deg*Math.PI/180.0);}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
mMap=谷歌地图;
//setUpMap();
试一试{
mMap.setMapType(GoogleMap.MAP\u TYPE\u NORMAL);
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
考虑到呼叫
//ActivityCompat#请求权限
//在此处请求缺少的权限,然后覆盖
//public void onRequestPermissionsResult(int-requestCode,字符串[]权限,
//int[]格兰特结果)
//处理用户授予权限的情况。请参阅文档
//对于ActivityCompat,请请求权限以获取更多详细信息。
返回;
}
mMap.setMyLocationEnabled(真);
mMap.setIndoorEnabled(真);
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
mMap.getUiSettings().setCompassEnabled(true);
mMap.getUiSettings().setAllGesturesEnabled(true);
String[]arr=新字符串[modelData.outletList.size()];

对于(int i=0;i您在OnMapReady函数中编写的代码太多了,请从中删除该代码,我可以看到OnMapReady中有4个以上的“for”循环,将该部分移动到其他地方,如OnCreate()创建您想要的所有映射和列表


只需使用OnMapReady函数放置标记

Geocoder。getFromLocation()
是一个昂贵的调用,它会对Google的服务器进行网络调用,因此不要在UI线程上进行调用


在android开发者文档中查看在后台发出请求的各种方式。

即使我尝试将循环部分放置在单独的函数中,map也不会显示所需的输出,它只显示我的位置……但是上面的代码显示了正确的输出,但需要