2016-08-29 8 views
0

getWidth должен вызываться из потока пользовательского интерфейса. Как я его исправить? Я пытаюсь создать файл pdf .. но getWidth, getHeight и getCanvas появляются ошибки !!!getWidth должен вызываться из потока пользовательского интерфейса

private class PdfGenerationTask extends AsyncTask<Void, Void, String> { 

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

     PdfDocument document = new PdfDocument(); 

     // repaint the user's text into the page 
     View content = findViewById(R.id.pdf_content); 

     // crate a page description 
     int pageNumber = 1; 
     PageInfo pageInfo = new PageInfo.Builder(content.getWidth(), 
       content.getHeight() - 20, pageNumber).create(); 

     // create a new page from the PageInfo 
     Page page = document.startPage(pageInfo); 

     content.draw(page.getCanvas()); 

     // do final processing of the page 
     document.finishPage(page); 

     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyyhhmmss"); 
     String pdfName = "pdfdemo" 
       + sdf.format(Calendar.getInstance().getTime()) + ".pdf"; 

     File outputFile = new File("/sdcard/PDFDemo_AndroidSRC/", pdfName); 

     try { 
      outputFile.createNewFile(); 
      OutputStream out = new FileOutputStream(outputFile); 
      document.writeTo(out); 
      document.close(); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return outputFile.getPath(); 
    } 
+0

Вы не можете позвонить GetWidth из ниток (в вашем случае doInBackground), вы можете скорее сохранить ширину в методе preExecute и использовать его в doInBackground – user2582324

ответ

0

Вы можете получить размер экрана так:

Display display = getWindowManager().getDefaultDisplay(); 
int screenWidth = display.getWidth(); 
int screenHeight = display.getHeight(); 

Но это, кажется устаревшим. Получить его, как это сейчас:

DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
int screenWidth = metrics.heightPixels; 
int screenHeight = metrics.widthPixels; 
+0

Где я вставить это?! THankYOu –

+0

Вы можете поместить это на свой onCreate (...) или передать его как параметр (если этот класс не находится внутри действия) –

+0

класс PdfGenerationTask теперь находится внутри MainActivity !!! Как n что делать? chnge? –

0

AsyncTask работает на разных Thread и UI операций происходит на Main Thread, так что вы не можете получить UI связанную информацию из разных Thread. Вы должны передать UI данные, относящиеся к вашему AsyncTask и выполнить работу.

В ваших Activity'sonCreate() метод получить размеры, как этот

DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
int screenWidth = metrics.heightPixels; 
int screenHeight = metrics.widthPixels; 
Canvas canvas = page.getCanvas(); 

и передать на ваш asyncTask следующим

PdfGenerationTask pdfGenerationTask = new PdfGenerationTask(screenWidth, screenHeight, canvas); 
pdfGenerationTask.execute(); 

и обновить PdfGenerationTask класс следующим образом

private class PdfGenerationTask extends AsyncTask<Void, Void, String> { 

    int width, height; 
    Canvas canvas; 
    PdfGenerationTask(int width, int height, Canvas canvas) { 
     this.width = width; 
     this.height = height; 
     this.canvas = canvas; 
    } 

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

     PdfDocument document = new PdfDocument(); 

     // repaint the user's text into the page 
     View content = findViewById(R.id.pdf_content); 

     // crate a page description 
     int pageNumber = 1; 
     PageInfo pageInfo = new PageInfo.Builder(width, 
       height - 20, pageNumber).create(); 

     // create a new page from the PageInfo 
     Page page = document.startPage(pageInfo); 

     content.draw(canvas); 

     // do final processing of the page 
     document.finishPage(page); 

     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyyhhmmss"); 
     String pdfName = "pdfdemo" 
       + sdf.format(Calendar.getInstance().getTime()) + ".pdf"; 

     File outputFile = new File("/sdcard/PDFDemo_AndroidSRC/", pdfName); 

     try { 
      outputFile.createNewFile(); 
      OutputStream out = new FileOutputStream(outputFile); 
      document.writeTo(out); 
      document.close(); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return outputFile.getPath(); 
    } 
+0

Окей сделано..but getCanvas()); приходит вверх wd такая же ошибка ?? –

+0

Пропустите свой холст в том же месте, что и мы прошли ширину и высоту – Nikhil

+0

int canvas = metrics.? thnq !! –

0

Реализовать onPr eExecute из AsyncTask и делать призвание GetHeight, GetWidth и getCanvas

private class PdfGenerationTask extends AsyncTask<Void, Void, String> { 
    @Override 
    protected String onPreExecute(Void params){ 
     this.height=getHeight(); 
     this.width=getWidth(); 
    } 
    @Override 
    protected String doInBackground(Void... params) { 

     PdfDocument document = new PdfDocument(); 

     // repaint the user's text into the page 
     View content = findViewById(R.id.pdf_content); 

     // crate a page description 
     int pageNumber = 1; 
     PageInfo pageInfo = new PageInfo.Builder(content.getWidth(), 
       content.getHeight() - 20, pageNumber).create(); 

     // create a new page from the PageInfo 
     Page page = document.startPage(pageInfo); 

     content.draw(page.getCanvas()); 

     // do final processing of the page 
     document.finishPage(page); 

     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyyhhmmss"); 
     String pdfName = "pdfdemo" 
       + sdf.format(Calendar.getInstance().getTime()) + ".pdf"; 

     File outputFile = new File("/sdcard/PDFDemo_AndroidSRC/", pdfName); 

     try { 
      outputFile.createNewFile(); 
      OutputStream out = new FileOutputStream(outputFile); 
      document.writeTo(out); 
      document.close(); 
      out.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return outputFile.getPath(); 
    } 
Смежные вопросы