Конвертировать данные курсора запроса в URL и запустить его в AsyncTask - PullRequest
0 голосов
/ 03 января 2019

Привет, я использую функцию, которая выглядит следующим образом.Он преобразует строку в URL

protected URL stringToURL(String urlString) {
    try {
        URL url = new URL(urlString);
        return url;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    return null;
}

и пример использования этого:

final URL url1  = stringToURL("www.link_to_my_page/sample_image1.jpg");

, и если я захочу использовать больше, я просто буду использовать его следующим образом.

final URL url1  = stringToURL("www.link_to_my_page/sample_image1.jpg");
final URL url2  = stringToURL("www.link_to_my_page/sample_image2.jpg");
final URL url3  = stringToURL("www.link_to_my_page/sample_image3.jpg");
final URL url4  = stringToURL("www.link_to_my_page/sample_image4.jpg");
final URL url5  = stringToURL("www.link_to_my_page/sample_image5.jpg");
final URL url6  = stringToURL("www.link_to_my_page/sample_image6.jpg");
final URL url7  = stringToURL("www.link_to_my_page/sample_image7.jpg");
final URL url8  = stringToURL("www.link_to_my_page/sample_image8.jpg");
final URL url9  = stringToURL("www.link_to_my_page/sample_image9.jpg");

, а затем у меня есть AsyncTask, который будет обрабатывать все это, и вот он

private class DownloadTask extends AsyncTask<URL, Integer, ArrayList<image_class>> {
    protected void onPreExecute() {

    }

    protected ArrayList<image_class> doInBackground(URL... urls) {

    }

    protected void onProgressUpdate(Integer... progress) {

    }

    protected void onCancelled() {

    }

    protected void onPostExecute(ArrayList<image_class> result) {

    }
}

, и если я хочу запустить свой AsyncTask, я назову его так

mMyTask = new DownloadTask().execute(url1);

или для нескольких

mMyTask = new DownloadTask().execute(url1,url2,url3,url4,url5,url6,url7,url8,url9);

и теперь вот мое беспокойство.все мои ссылки внутри моей SQLite базы данных и то, что я до сих пор делал, - это создаю Cursor Loop их, используя stringToURL внутри массива, затем называю это вот так mMyTask = new DownloadTask().execute(Array_of_Urls.ToString());, но не повезло, и это дало ошибки.

Мой вопрос: как можно вызвать эту задачу, используя мои URL в базе данных?

Вот мой текущий код

для метода создания

load_sync = findViewById(R.id.load_sync);
mProgressAnimation = new ProgressBarAnimation(load_sync, 100);

startMyAsyncTaskWithURList();

и здесьвесь код

private ArrayList<URL> getMyURLFromDB() {
    ArrayList<URL> listURL = new ArrayList<>();

    Cursor cursor = Sync.get_image(current_email);
    while (cursor.moveToNext()) {
        String folder = cursor.getString(cursor.getColumnIndex("folder"));
        String urlString = cursor.getString(cursor.getColumnIndex("myimage"));
        String gen_link = "Custom URL" + folder + "/" + urlString;
        Log.e("Link ", "" + gen_link);
        URL url = null;
        try {
            url = new URL(gen_link);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        listURL.add(url);
    }
    return listURL;
}

private class DownloadTask extends AsyncTask<String, Integer, ArrayList<image_class>> {
    protected void onPreExecute() {

    }

    ArrayList<URL> listURL = null;
    public DownloadTask(ArrayList<URL> urls){
        this.listURL = urls;
    }

    protected ArrayList<image_class> doInBackground(String... params) {
        int count = listURL.size();
        HttpURLConnection connection = null;
        ArrayList<image_class> bitmaps = new ArrayList<>();

        for (int i = 0; i < count; i++) {
            URL currentURL = listURL.get(i);
            String fileName = currentURL.toString().substring(currentURL.toString().lastIndexOf('/') + 1);

            try {
                connection = (HttpURLConnection) currentURL.openConnection();
                connection.connect();

                InputStream inputStream = connection.getInputStream();
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

                Bitmap bmp = BitmapFactory.decodeStream(bufferedInputStream);
                bitmaps.add(new image_class(bmp,fileName));

                publishProgress((int) (((i + 1) / (float) count) * 100));
                if (isCancelled()) {
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                connection.disconnect();
            }

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return bitmaps;

    }

    protected void onProgressUpdate(Integer... progress) {
        mProgressAnimation.setProgress(progress[0]);
    }

    protected void onPostExecute(ArrayList<image_class> result) {
        Iterator itr = result.iterator();
        while(itr.hasNext()){
            image_class st = (image_class) itr.next();
            Bitmap bitmap = st.image;
            saveImageToInternalStorage(bitmap, st.filename);
        }
    }
}

protected Uri saveImageToInternalStorage(Bitmap bitmap, String filename) {
    File file = sdCardDirectory;
    file = new File(file, filename);

    try {
        OutputStream stream = null;
        stream = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        stream.flush();
        stream.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

    Uri savedImageURI = Uri.parse(file.getAbsolutePath());
    return savedImageURI;
}

изображение не загружается или AsyncTask не работает

1 Ответ

0 голосов
/ 03 января 2019

Это просто базовая схема:

private ArrayList<> getMyURLFromDB(){
    ArrayList<> listURL = new ArrayList<>();

    // You will need to fill in some blanks here...
    //... This is just a basic outline!
    SQLiteDatabase db = dbModel.getReadableDatabase();
    Cursor cursor = db....
    while (cursor.moveToNext()) {
        String urlString = cursor.getString(cursor.getColumnIndex(MY_URL_STRING));
        URL url = new URL(urlString);
        listURL.add(url);
    }
    return listURL;
}


Получить список из базы данных и передать ArrayList в качестве параметра AsyncTask:

private void startMyAsyncTaskWithURList(){
    ArrayList<URL> listURL = getMyURLFromDB();
    // Just pass the ArrayList as a parameter
    new DownloadTask(listURL).execute();
}


Вам необходимо добавить конструктор AsyncTask, который будет принимать ArrayList в качестве параметра:

private class DownloadTask extends AsyncTask<String, Integer, ArrayList<image_class>> {

    ArrayList<URL> listURL = null;
    public DownloadTask(ArrayList<URL> urls){
        this.listURL = urls;    
    }

    protected ArrayList<image_class> doInBackground(String... params) {
        // Now you have access to the list
        if(listURL != null){
        }

    }


    protected void onPostExecute(ArrayList<image_class> result) {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...