Android 4.4 Printing - "java.lang.IllegalStateException: печать уже ожидает"

Я работаю над печатью веб-просмотра на Android. Я сталкиваюсь с проблемой, когда я получаю незаконное государственное исключение. Это происходит только тогда, когда я вызываю "print" два (или более) раза очень быстро. Авария не входит в мой стек вызовов, поэтому использование try-catch не сработает.

Примечание. Я выполняю вызовы с помощью рефлексии ( Как мне распечатать WebView с использованием KitKat 4.4 API печати с помощью рефлексии?), Но я уверен, что использование API могло бы сделать то же самое для меня (но я в конечном итоге проверю) (Правка: Только что проверил. Сделал простое приложение с веб-просмотром и кнопкой. Когда я нажимаю кнопку два раза очень быстро, все приложение вылетает.).

Трассировки стека:

java.lang.IllegalStateException: printing is already pending
  at com.android.org.chromium.android_webview.AwPdfExporter.exportToPdf(AwPdfExporter.java:51)
  at com.android.org.chromium.android_webview.AwPrintDocumentAdapter.exportPdf(AwPrintDocumentAdapter.java:100)
  at com.android.org.chromium.android_webview.AwPrintDocumentAdapter.onWrite(AwPrintDocumentAdapter.java:81)
  at android.print.PrintManager$PrintDocumentAdapterDelegate$MyHandler.handleMessage(PrintManager.java:609)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4998)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
  at dalvik.system.NativeStart.main(Native Method)

Вопрос: как мне этого избежать?

Изменить: это мое тестовое приложение. Если я дважды нажму кнопку, прежде чем появится диалоговое окно, я получу исключение, показанное выше. Как я могу избежать этого, не используя что-то вроде "хакерского" тайм-аута.

MainActivity.java:

package com.example.test;

import android.os.Bundle;
import android.print.PrintAttributes;
import android.print.PrintDocumentAdapter;
import android.print.PrintManager;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button1);
        final WebView webview = (WebView) findViewById(R.id.webView1);
        webview.setWebViewClient(new WebViewClient());
        webview.loadUrl("http://google.com");

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        createWebPrintJob(webview);
                    }
                });
            }
        });
    }

    private void createWebPrintJob(WebView webView) {
        PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);

        PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
        String jobName = getString(R.string.app_name) + " Document";
        printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build());
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="fill"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Button" />

</RelativeLayout>

0 ответов

Это происходит потому, что, когда вы дважды нажимаете кнопку, создается два задания на печать, а первое задание на печать еще не завершено,

Используйте обработчик задержки, чтобы отключить кнопку, это предотвратит случайное нажатие пользователем дважды.

Вы не можете отдать печать, пока не очистите диспетчер очереди печати. Чтобы очистить настройки диспетчера очереди печати -> Приложения -> Показать системные приложения -> выберите и снимите флажок для диспетчера очереди печати.

Другие вопросы по тегам