मेरे पास मेरे आवेदन में एक समय लेने वाला कार्य है जिसे समाप्त करने में कुछ मिनट लगते हैं। कार्य ओआरबी एल्गोरिदम का उपयोग करके छवि मिलान के बारे में है, गैलरी में सभी छवियों के साथ एक छवि क्वेरी की तुलना की जाती है और फिर समान छवियों को सूची दृश्य में वापस कर दिया जाता है, कार्य में लगने वाले लंबे समय के कारण, मैं Asynctask के साथ एक प्रगति संवाद जोड़ना पसंद करता हूं। समस्या यह है कि जब मैं खोज बटन दबाता हूं तो प्रगति संवाद लंबे समय तक प्रकट होता है और फिर ऐप क्रैश हो जाता है, इसलिए ऐसा लगता है कि जब प्रक्रिया समाप्त हो जाती है तो प्रगति संवाद को छिपाने और सूचीदृश्य में परिणाम दिखाने के बजाय ऐप क्रैश हो जाता है। (जानना कि कोड सामान्य रूप से प्रगति के बिना संवाद और asynctask काम करता है)। इसके अलावा मैंने थ्रेड और उसी समस्या का उपयोग करके इसे आजमाया। किसी भी तरह की सहायता की हम सराहना करेंगे। अग्रिम में धन्यवाद

खोज बटन कोड:

 searchButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

           BackgroundTaskSearch task = new BackgroundTaskSearch(RGBtoGrey.this);
          task.execute();

    }

    });

एसिंक टास्क कोड:

 private class BackgroundTaskSearch extends AsyncTask <Void, Void, Void> {
    private ProgressDialog dialog;

    public BackgroundTaskSearch(RGBtoGrey activity) {
        dialog = new ProgressDialog(activity);

    }

    @Override
    protected void onPreExecute() {
        dialog.setMessage("Doing something, please wait.");
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }

    @Override
    protected void onPostExecute(Void result) {
        if (dialog.isShowing()) {
            dialog.dismiss();

           /* try
            {
                dialog.dismiss();
            }
            catch (Exception e)
            {
            }*/

        }
    }

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

        search(); // Calling method of the long time task


        return null;
    }

}

Locat: लाइन (RGBtoGrey.java:1030) डायलॉग है। शो (); onPreExecute() और लाइन (RGBtoGrey.java:331) में task.execute() है; खोज बटन क्रिया में यहां छवि विवरण दर्ज करें

खोज () विधि कोड:

public void search(){



    Mat qmat = new Mat();
    Mat jsonmat =null;

    String q = qtag.getText().toString().trim();

    if (!searchType.equals("byImage") && (q.isEmpty() || q.length() == 0 || q.equals("") || q == null)) {
        Toast.makeText(getApplicationContext(), "Please insert image or tag", Toast.LENGTH_LONG).show();
    } else {

        if(!searchType.equals("byImage")) {
            DataBaseHandler db2 = new DataBaseHandler(getApplicationContext());


            List<image> list = db2.getImages(q);
            for (int i = 0; i < list.size(); i++) {
                imageList.add(list.get(i));
            }
            if (imageList.size() != 0 && imageList.size() > 1)
                t.setText(Integer.toString(imageList.size()) + " images found");
            if (imageList.size() != 0 && imageList.size() == 1)
                t.setText(Integer.toString(imageList.size()) + " image found");
            if (imageList.size() == 0)
                t.setText("No result");

           adapter.notifyDataSetChanged();
        }

        if (TYPE.equals("gallery")) {

            BitmapFactory.Options bmOptions = new BitmapFactory.Options();


            Bitmap qbitmap0 = BitmapFactory.decodeFile(picPath, bmOptions);


            Bitmap qbitmap = getRotated(qbitmap0, picPath);


            Mat qmatRGB = new Mat();
            Utils.bitmapToMat(qbitmap, qmatRGB);
            Imgproc.cvtColor(qmatRGB, qmat, Imgproc.COLOR_RGB2GRAY);

            org.opencv.core.Size s = new Size(3, 3);
            Imgproc.GaussianBlur(qmat, qmat, s, 2);

        }

        if (TYPE.equals("camera")) {



            Mat qmatRGB = new Mat();
            Utils.bitmapToMat(photo, qmatRGB);
            Imgproc.cvtColor(qmatRGB, qmat, Imgproc.COLOR_RGB2GRAY);

            org.opencv.core.Size s = new Size(3, 3);
            Imgproc.GaussianBlur(qmat, qmat, s, 2);


        }

        ArrayList<String> pathArray = getFilePaths();
        DataBaseHandler db = new DataBaseHandler(getApplicationContext());

        List<mat> matlist =db.getAllMats();

        FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
        MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
        detector.detect(qmat, keypoints1);

        DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
        Mat descriptors1 = new Mat();
        extractor.compute(qmat, keypoints1, descriptors1);


        for (int i = 0; i < pathArray.size(); i++) {


            BitmapFactory.Options bmOptions1 = new BitmapFactory.Options();


            Bitmap bitmap0 = BitmapFactory.decodeFile(pathArray.get(i).toString(), bmOptions1);

            Bitmap bitmap = getRotated(bitmap0, pathArray.get(i).toString());
            Mat mat = new Mat();

            Mat matRGB = new Mat();
            Utils.bitmapToMat(bitmap, matRGB);
            Imgproc.cvtColor(matRGB, mat, Imgproc.COLOR_RGB2GRAY);

            org.opencv.core.Size s2 = new Size(3, 3);
            Imgproc.GaussianBlur(mat, mat, s2, 2);


            mat m =matlist.get(i);
            String smat = m.getMat();
            String smatkey = m.getMatimage();

            Mat descriptors2 = matFromJson(smat);
            Mat keypoints2 = keypointsFromJson(smatkey);


            DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
            MatOfDMatch matches = new MatOfDMatch();

            matcher.match(descriptors1, descriptors2, matches);

            List<DMatch> matchesList = matches.toList();


            List<DMatch> matches_final = new ArrayList<DMatch>();
            for (int j = 0; j < matchesList.size(); j++)
                if (matchesList.get(j).distance <= DIST_LIMIT) {
                    matches_final.add(matches.toList().get(j));

                }


            List<MatOfDMatch> matcheslis = new ArrayList<MatOfDMatch>();
            matcher.knnMatch(descriptors1, descriptors2,
                    matcheslis, 2);
            ArrayList<KeyPoint> objectPoints = new ArrayList<KeyPoint>(), imagePoints = new ArrayList<KeyPoint>();
            for (MatOfDMatch match : matcheslis) {
                DMatch[] dmatches = match.toArray();
                if (dmatches.length == 2
                        && dmatches[0].distance < dmatches[1].distance * 0.75) {
                    imagePoints
                            .add(keypoints1.toArray()[dmatches[0].queryIdx]);
                    objectPoints
                            .add(((MatOfKeyPoint) keypoints2).toArray()[dmatches[0].trainIdx]);
                }
            }
            float ratio = ((float) objectPoints.size())
                    / ((float) keypoints2.size().width);



            // ration>=12
            if (ratio >= 16 || matches_final.size() >= 147) {
                image Image = new image();
                Image.setImageURL(pathArray.get(i).toString());
                Image.setGoodMatches(matches_final.size());
                Image.setRatio(ratio);
                imageList.add(Image);


            }


        }

        for (int k = 0; k < imageList.size(); k++) {
            if (imageList.get(k).getImageURL().equals(picPath))
                imageList.remove(k);
        }
        if (imageList.size() != 0 && imageList.size() > 1)
            t.setText(Integer.toString(imageList.size()) + " images found");
        if (imageList.size() != 0 && imageList.size() == 1)
            t.setText(Integer.toString(imageList.size()) + " image found");
        if (imageList.size() == 0)
            t.setText("No result");


        adapter.notifyDataSetChanged();


    }
}
1
wisam 18 अप्रैल 2019, 11:19

1 उत्तर

सबसे बढ़िया उत्तर

जहाँ तक मैं आपके कोड से देख सकता हूँ, आप doInBackground पद्धति में अपना UI अपडेट करने का प्रयास कर रहे हैं। doInBackground वर्कर थ्रेड में चलता है और Android में आप UI को केवल मुख्य थ्रेड में अपडेट कर सकते हैं। अपना लंबा समय doInBackground पद्धति में करें लेकिन अपने UI को एक मुख्य थ्रेड विधि में अपडेट करें, उदाहरण के लिए onProgressUpdate या onPostExecute। asynctask के बारे में अधिक जानकारी यहां

2
Nicola Gallazzi 18 अप्रैल 2019, 08:48