Загрузка файла PDF из URL работает в основном потоке, но выдает ошибки при использовании asynctask - PullRequest
0 голосов
/ 12 июня 2019

Я пишу программу для загрузки PDF-файла из URL-адреса в байтовый формат, а затем отображать его в PdfViewer в Android.Однако загрузка занимает некоторое время, и я хотел бы сделать это в отдельном потоке, используя asynctask.Код хорошо работает без asynctask, но выдает ошибку, когда я использую asynctask.

        loadBookPdf.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           AsyncTask<String, Void, byte[]> task = new AsyncTask<String, 
           Void, byte[]>() {
                ProgressBar bar;

                @Override
                protected void onPreExecute() {
                    bar = findViewById(R.id.progressBar);
                    bar.setVisibility(View.VISIBLE);
                }

                @Override
                protected byte[] doInBackground(String... strings) {
                    Log.e("thread", "success?");
                    String urlString = strings[0];
                    byte[] bookByte = getFile(urlString);
                    Log.e("thread", "success");
                    return bookByte;

                }

                @Override
                protected void onPostExecute(byte[] bytes) {
                    fileReader = bytes;
                    bar.setVisibility(View.GONE);
                }
            };

            task.execute(BookBriefInfo.textUrl);

       //  fileReader = getFile(BookBriefInfo.textUrl);
            Intent intent = new Intent(BookBriefInfo.this, 
            BookPdfReader.class);
            startActivity(intent);
            finish();
        }
    });

Код считывателя файлов:

    private byte[] getFile(String pdfUrl) {
    //TODO send translation URL from cloudLibraryAdaptor
    URL url;
    HttpURLConnection c;
    byte[] bytes = null;
    try {
        url = new URL(pdfUrl);
        c = (HttpURLConnection) url.openConnection();
        c.setRequestMethod("GET");
        c.connect();

        InputStream is = c.getInputStream();

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];

        for (int readNum; (readNum = is.read(buf)) != -1; ) {
            bos.write(buf, 0, readNum);

        }
        bytes = bos.toByteArray();

        // fileReader = bytes;

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

Ошибка, которую я получаю:

   A/zygote: java_vm_ext.cc:504] JNI DETECTED ERROR IN APPLICATION: jarray 
   was NULL
java_vm_ext.cc:504]     in call to GetByteArrayElements
java_vm_ext.cc:504]     from long com.shockwave.pdfium.PdfiumCore.nativeOpenMemDocument(byte[], java.lang.String)
java_vm_ext.cc:504] "AsyncTask #2" prio=5 tid=26 Runnable
java_vm_ext.cc:504]   | group="main" sCount=0 dsCount=0 flags=0 obj=0x1322fec0 self=0xa401dc00
java_vm_ext.cc:504]   | sysTid=8528 nice=10 cgrp=default sched=0/0 handle=0x8e10b970
java_vm_ext.cc:504]   | state=R schedstat=( 12742370 18637590 15 ) utm=1 stm=0 core=1 HZ=100
java_vm_ext.cc:504]   | stack=0x8e009000-0x8e00b000 stackSize=1038KB

A / zygote: java_vm_ext.cc:504] |удерживаемые мьютексы = "блокировка мутатора" (общий доступ)

1 Ответ

0 голосов
/ 12 июня 2019

Почему вы не используете залп для запроса? Этот код работает в реальном приложении прямо сейчас:

RequestQueue myQueue= Volley.newRequestQueue(this);
 InputStreamVolleyRequest request = new InputStreamVolleyRequest(Request.Method.GET, my_url,
                    new Response.Listener<byte[]>() {
                        @Override
                        public void onResponse(byte[] response) {
                            try {
                                if (response != null) {

                                    String path = "your_path";
                                    String filename = "your_filename";

                                    FileOutputStream outputStream;
                                    outputStream = openFileOutput(path + "/" + filename, Context.MODE_PRIVATE);
                                    outputStream.write(response);
                                    outputStream.close();

                                }
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE");
                                e.printStackTrace();

                            }
                        }
                    }, new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("Error response", error.toString());
                }
            }
            ) {
                // httpbin.org needs proper accept headers
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String>  params = new HashMap<String, String>();
                    //params.put("Content-Type", "application/pdf");

                    return params;
                }

            };
            request.setRetryPolicy((new DefaultRetryPolicy(60 * 1000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)));
            myQueue.add(request);
...