IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

AsyncTask et OutOfMemoryError: vrai problème ou question de méthode?


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut AsyncTask et OutOfMemoryError: vrai problème ou question de méthode?
    Hello,

    Je reprends le dév sous Android que je n'ai plus touché depuis un moment, et j'ai un problème "mémoire" (OutOfMemoryError)!

    LA question étant de savoir, si c'est un problème de méthode de ma part (pas impossible), ou un vrai soucis de dév...


    Le but:
    -> parser 2 pages d'un fichier PDF, en 2 fois, car un paramètre de recherche & la page de lecture du PDF diffèrent entre la lecture n°1 et la n°2
    -> et récupération des data dans un buffer, pour analyse

    Ma méthode:
    -> j'ai donc la fonction associée à mon bouton, qui se résume à appeler 2 fois mon AsyncTask, chaque fois avec les bons paramètres
    -> les 2 appels fonctionnent très bien en solo, soit l'une,soit l'autre
    -> MAIS les 2 ensemble = crash
    -> PIRE (et c'est là qu'il y a peut être finalement un problème de méthode...), quand je trace les appels
    • d'abord l'appel n°2 se lance d'abord, avant le 1er (après tout pourquoi pas)
    • mais en plus, j'ai les mêmes paramètres (sens, par exemple, alors qu'il vaut bien 1 et 2) lors des 2 appels(????)
    • alors qu'évidement, je lance bien mon AsyncTask avec des param différents pour les 2 appels

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void update_pdf (View view)
    	{ 
    		Bundle params = new Bundle();
     
    		params.putInt("pageDebut", 1); params.putInt("pageFin", 1); params.putInt("sens", 1); params.putString("arret", "Gare");
    		new AsyncTraiterPdf().execute(params);
     
    		params.clear();
     
    		params.putInt("pageDebut", 3); params.putInt("pageFin", 3); params.putInt("sens", 2); params.putString("arret", "Centre");
    		new AsyncTraiterPdf().execute(params);
    	}
    Les questions:
    -> (1) est-ce-que ça pose vraiment un problème de ressources d'appeler 2 fois (ou plus) 1 AsyncTask?
    (ce qui me semblait plus lisible/propre puisque c'est bien le même objet qui lit le fichier, au final!)

    -> (2) comment expliquer que les traces d'exécution montrent 2 fois les mêmes paramètres, alors qu'ils changent bien entre les 2 appels?

    -> (3) est-ce-que je devrais plutôt n'appeler qu'une seule fois mon AsyncTAsk, en y faisant directement mes 2 traitements différents?

    -> (4) est-ce-qu'un thread serait plus indiqué? quelles différences en fait, comment choisir entre les deux finalement?


    Questions peut être connes pour les experts que vous êtes , mais j'avoue sécher.........
    Sinon, je ne serais pas là!

  2. #2
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Dans ton cas, je pense qu'il faut lancer les 2 AsyncTasks plutôt avec la méthode executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params), que simplement avec execute(params).

    Quant à tes paramètres, ne réutilises pas le même objet. Créées 2 objets Bundle bien distincts, chacun pour son AsyncTask.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ok, je testerai ça demain.

    Mais quelle est la nuance? Exécution immédiate, du coup? Et quelle incidence sur la mémoire?

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Alors, petit résumé:

    (1) bundles
    -> déjà pour les 2 bundles de paramètres différents, effectivement, ça marche!
    -> par contre, j'aimerais bien comprendre pourquoi la formule d'un seul + clear() ne marchait pas... pas logique...

    (2) executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params)
    -> même problème mémoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    08-26 13:11:30.200: E/********************DEBUT(1830): sens 1
    08-26 13:11:30.201: E/********************DEBUT(1830): sens 2
    08-26 13:12:16.434: E/dalvikvm-heap(1830): Out of memory on a 65034-byte allocation.
    08-26 13:12:16.460: E/AndroidRuntime(1830): FATAL EXCEPTION: AsyncTask #1
    08-26 13:12:16.460: E/AndroidRuntime(1830): java.lang.RuntimeException: An error occured while executing doInBackground()
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.lang.Thread.run(Thread.java:856)
    08-26 13:12:16.460: E/AndroidRuntime(1830): Caused by: java.lang.OutOfMemoryError
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:63)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.fontbox.ttf.MemoryTTFDataStream.<init>(MemoryTTFDataStream.java:45)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:96)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.<init>(PDTrueTypeFont.java:108)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:65)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:74)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:32)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:809)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:471)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:445)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:147)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.contentstream.PDFTextStreamEngine.processPage(PDFTextStreamEngine.java:102)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:333)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:269)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:236)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:195)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at com.test.train.PdfManager.ToText(PdfManager.java:49)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:64)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:1)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    08-26 13:12:16.460: E/AndroidRuntime(1830): 	... 4 more
    08-26 13:12:18.276: E/dalvikvm-heap(1830): Out of memory on a 65034-byte allocation.
    (3) executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)
    -> mais étant donné que les exécutions précédentes se font en //, je préfère des exécutions sérialisées, l'une après l'autre, puisque dans les traitements il y aura une màj de la DB avec les data lues dans le PDF
    -> on va donc éviter les problèmes d'accès concurrents
    -> mais malheureusement, toujours débordement mémoire sur la 2ème exécution!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    08-26 13:18:23.392: E/********************DEBUT(1834): sens 1
    08-26 13:19:04.367: E/>>>******** colonne 2:(1834): 06:01
    08-26 13:19:04.367: E/>>>******** colonne 3:(1834): 06:30
    08-26 13:19:04.367: E/>>>******** colonne 4:(1834): 06:21
    08-26 13:19:04.367: E/>>>******** colonne 5:(1834): 07:01
    08-26 13:19:04.367: E/>>>******** colonne 6:(1834): 07:30
    08-26 13:19:04.367: E/>>>******** colonne 7:(1834): 08:00
    08-26 13:19:04.367: E/>>>******** colonne 8:(1834): 08:30
    08-26 13:19:04.367: E/>>>******** colonne 9:(1834): 08:21
    08-26 13:19:04.367: E/>>>******** colonne 10:(1834): 09:00
    08-26 13:19:04.367: E/>>>******** colonne 11:(1834): 09:30
    08-26 13:19:04.368: E/>>>******** colonne 12:(1834): 09:21
    08-26 13:19:04.368: E/>>>******** colonne 13:(1834): 10:00
    08-26 13:19:04.368: E/>>>******** colonne 14:(1834): 09:62
    08-26 13:19:04.368: E/>>>******** colonne 15:(1834): 11:00
    08-26 13:19:04.368: E/>>>******** colonne 16:(1834): 11:30
    08-26 13:19:04.368: E/>>>******** colonne 17:(1834): 11:21
    08-26 13:19:04.368: E/>>>******** colonne 18:(1834): 12:00
    08-26 13:19:04.368: E/>>>******** colonne 19:(1834): 12:30
    08-26 13:19:04.368: E/>>>******** colonne 20:(1834): 12:19
    08-26 13:19:04.368: E/>>>******** colonne 21:(1834): 13:00
    08-26 13:19:04.368: E/>>>******** colonne 22:(1834): 13:30
    08-26 13:19:04.368: E/>>>******** colonne 23:(1834): 13:21
    08-26 13:19:04.368: E/>>>******** colonne 24:(1834): 14:00
    08-26 13:19:04.368: E/>>>******** colonne 25:(1834): 14:30
    08-26 13:19:04.368: E/>>>******** colonne 26:(1834): 14:21
    08-26 13:19:04.368: E/>>>******** colonne 27:(1834): 15:00
    08-26 13:19:04.369: E/>>>******** colonne 2:(1834): 15:22
    08-26 13:19:04.369: E/>>>******** colonne 3:(1834): 15:30
    08-26 13:19:04.369: E/>>>******** colonne 4:(1834): 16:00
    08-26 13:19:04.369: E/>>>******** colonne 5:(1834): 16:30
    08-26 13:19:04.369: E/>>>******** colonne 6:(1834): 16:21
    08-26 13:19:04.369: E/>>>******** colonne 7:(1834): 16:49
    08-26 13:19:04.370: E/>>>******** colonne 8:(1834): 17:00
    08-26 13:19:04.370: E/>>>******** colonne 9:(1834): 17:30
    08-26 13:19:04.370: E/>>>******** colonne 10:(1834): 17:21
    08-26 13:19:04.370: E/>>>******** colonne 11:(1834): 18:00
    08-26 13:19:04.370: E/>>>******** colonne 12:(1834): 17:49
    08-26 13:19:04.370: E/>>>******** colonne 13:(1834): 18:30
    08-26 13:19:04.370: E/>>>******** colonne 14:(1834): 18:21
    08-26 13:19:04.370: E/>>>******** colonne 15:(1834): 19:00
    08-26 13:19:04.370: E/>>>******** colonne 16:(1834): 19:30
    08-26 13:19:04.370: E/>>>******** colonne 17:(1834): 19:21
    08-26 13:19:04.370: E/>>>******** colonne 18:(1834): 19:59
    08-26 13:19:04.370: E/>>>******** colonne 19:(1834): 20:40
    08-26 13:19:04.371: E/>>>******** colonne 20:(1834): 21:44
    08-26 13:19:04.371: E/>>>******** colonne 21:(1834): 22:29
    08-26 13:19:04.371: E/>>>******** colonne 22:(1834): 23:24
    08-26 13:19:04.371: E/********************FIN(1834): sens 1
    
    08-26 13:19:04.373: E/********************DEBUT(1834): sens 2
    08-26 13:19:33.761: E/dalvikvm-heap(1834): Out of memory on a 65034-byte allocation.
    08-26 13:19:33.776: E/AndroidRuntime(1834): FATAL EXCEPTION: AsyncTask #2
    08-26 13:19:33.776: E/AndroidRuntime(1834): java.lang.RuntimeException: An error occured while executing doInBackground()
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.lang.Thread.run(Thread.java:856)
    08-26 13:19:33.776: E/AndroidRuntime(1834): Caused by: java.lang.OutOfMemoryError
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.fontbox.ttf.MemoryTTFDataStream.<init>(MemoryTTFDataStream.java:52)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:96)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.pdmodel.font.PDTrueTypeFont.<init>(PDTrueTypeFont.java:108)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:65)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:74)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.operator.text.SetFontAndSize.process(SetFontAndSize.java:32)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:809)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:471)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:445)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:147)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.contentstream.PDFTextStreamEngine.processPage(PDFTextStreamEngine.java:102)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.java:333)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.java:269)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.java:236)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at org.apache.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.java:195)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at com.test.train.PdfManager.ToText(PdfManager.java:49)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:64)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at com.test.train.AsyncTraiterPdf.doInBackground(AsyncTraiterPdf.java:1)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    08-26 13:19:33.776: E/AndroidRuntime(1834): 	... 5 more

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Le problème ne vient pas des Asynctask mais de tes traitements qui consomme trop de mémoire et/ou ne la libère pas correctement.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 535
    Par défaut
    Ok, alors voici le code

    (mais Java libère pourtant ses ressources lui-même avec le GC, pas besoin de free() après un malloc() comme en C, par exemple )

    AsyncTraiterPdf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    package com.test.train;
     
    import java.io.IOException;
    import java.util.ArrayList;
     
    import android.app.ProgressDialog;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
     
     
    public class AsyncTraiterPdf extends AsyncTask<Bundle, Void, Void>
    {
    	private static PdfManager pdfManager;
    	private static final String pdfPath = "/storage/sdcard0/download/Train.pdf";
     
     
    	@Override
        protected void onPreExecute() 
    	{
    		super.onPreExecute();
     
    		pdfManager = new PdfManager();  		
    		pdfManager.setFilePath(pdfPath);
            }  
     
    	@Override
    	protected Void doInBackground(Bundle... params) 
    	{
    		int pageDebut=0, pageFin=0, sens=0, indice=0;
    		String arret;
    		String buffer = "";
     
    	        Bundle result = params[0];
    		pageDebut = result.getInt("pageDebut");
    		pageFin = result.getInt("pageFin");
    		sens = result.getInt("sens");
    		arret = result.getString("arret");
     
     
      	 Log.e("********************DEBUT", "sens "+ sens);
     
     	   try 
     	   {
     		   	buffer = pdfManager.ToText(pageDebut, pageFin);   
     	   } 
     	   catch (IOException e1) 
     	   {
    			// TODO Auto-generated catch block
     		   Log.e(">>>********ERREUR fichier PDF ", pdfManager.toString());    
     	   }
     	   String lines[] = buffer.split("\\r?\\n");
     
     
     	   ArrayList<String> linesOK = new ArrayList<String>();
     	   indice = 0;
     	   try
     	   {
    	    	   while (!lines[indice].isEmpty())
    	    	   {
    	    		   if (lines[indice].indexOf(arret) != -1)
    	    		   {
    	    			   linesOK.add(lines[indice]);
    	    		   }
    	    		   indice += 1;
    	    	   }
     	   }
     	   catch (ArrayIndexOutOfBoundsException e)
     	   {
     		   //e.printStackTrace();
     	   }
     
     
     
     	   for(indice = 0; indice <linesOK.size(); indice ++)
     	   {
     		   String cols[] = linesOK.get(indice).toString().split("\\s+");
     		   for(int j= 2; j< cols.length; j++)
     		   {
     			   cols[j] = cols[j].replace('.', ':');
     			   Log.e(">>>******** colonne " +j+": ",cols[j]);     
     
     			   //stockage en base restant à faire!
     		   }
     
     	   }
     
     	  Log.e("********************FIN","sens "+ sens);
     
    		// TODO Auto-generated method stub
    		return null;
    	}
     
     
    	@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
     
        }
     
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }
     
    }
    PdfManager
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package com.test.train;
    
    import android.util.Log;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.pdfbox.cos.COSDocument;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.util.PDFTextStripper;
    
    
    public class PdfManager {
        
       private PDFParser parser;
       private PDFTextStripper pdfStripper;
       private PDDocument pdDoc ;
       private COSDocument cosDoc ;
       
       private String Text ;
       private String filePath;
       private File file;
    
       
       public PdfManager() 						{ /* TODO Auto-generated constructor stub */ }
       public void setFilePath(String filePath) { this.filePath = filePath; } 
       
       
       public String ToText(int pageDebut, int pageFin) throws IOException
       {
           this.pdfStripper = null;
           this.pdDoc = null;
           this.cosDoc = null;     
    
           file = new File(filePath);
           parser = new PDFParser(new FileInputStream(file));
    
           parser.parse();      
           cosDoc = parser.getDocument(); 
           pdfStripper = new PDFTextStripper();
           pdDoc = new PDDocument(cosDoc);
           pdDoc.getNumberOfPages();
           pdfStripper.setStartPage(pageDebut);      
           pdfStripper.setEndPage(pageFin);
    
    	Text = pdfStripper.getText(pdDoc);
    
           return Text;
        
       }
       
    }
    PDFTextStripper.getText (librairie PDFBox)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public String getText(PDDocument doc) throws IOException
    	{
    		StringWriter outputStream = new StringWriter();
    		writeText(doc, outputStream);
    		return outputStream.toString();
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un vrai problème de son..
    Par polevka dans le forum Windows Vista
    Réponses: 1
    Dernier message: 19/12/2007, 20h13
  2. Problème et questions sur un calcul de distance
    Par ale2000 dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 11/09/2007, 20h33
  3. Sessions, variables, problèmes et questions
    Par gloubi dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2007, 10h46
  4. Problème jCombobox : Question métaphysique.
    Par catwomanette dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 16/01/2007, 10h47
  5. Firbird / IB Expert / MySQL : problèmes et questions
    Par DragOr dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/12/2006, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo