Autore Topic: Passaggio parametri ad AsyncTask: NullPointerException  (Letto 463 volte)

Offline Elmvor

  • Utente normale
  • ***
  • Post: 166
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 14.04, Windows 8.1
Passaggio parametri ad AsyncTask: NullPointerException
« il: 17 Giugno 2014, 13:56:43 CEST »
0
Salve. Molto probabilmente si tratterà di una stupidità, come di solito faccio quando programmo.
La storia è questa:

Nell'Activity principale reperisco un file dal telefono (in onActivityResult) e creo un'istanza della classe Gpx che rappresenta un percorso:

Codice: [Seleziona]
mFileName = data.getStringExtra("GetFileName");
String mCurFilePath = data.getStringExtra("GetPath") + "/" + mFileName;
File file = new File(mCurFilePath);
gpx = new Gpx(file, MainActivity.this); //è una variabile d'istanza dichiarata come private Gpx gpx;

La classe Gpx si occupa di inizializzare una lista tramite un AsyncTask utilizzando il file passato come parametro:

Codice: [Seleziona]
public class Gpx extends AbstractTrack {


    private File file;


    private static final String TAG_LOG = Gpx.class.getName();


    public Gpx(File file, Context context) {
        super(context);
        this.file = file;
        Log.d(TAG_LOG, file.toString()); //prints correctly
        build();
    }


    /**
     * Esegue la costruzione del tracciato, inizializzando i campi privati
     */
    protected void build() {
        ParserAsyncTask parserAsyncTask = new ParserAsyncTask(file);
        parserAsyncTask.execute();
    }


    /**
     * AsyncTask che effettua il parsing del file gpx
     */
    private class ParserAsyncTask extends AsyncTask<Void,Void,Void> {


        private ProgressDialog mDialog;
        private File file;


        public ParserAsyncTask(File file) {
            this.file = file;
        }


        protected void onPreExecute() {
            mDialog = ProgressDialog.show(context, "", "Caricamento...", true);
        }


        protected void onPostExecute(Void unused) {
            if(mDialog != null) {
                if(mDialog.isShowing()) {
                    mDialog.dismiss();
                }
            }
            //calcolo la lunghezza del tracciato
            calculatesLength();
        }


        protected Void doInBackground(Void... param) {


             try {
                //Si crea l’oggetto XmlPullParserFactory
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                //Abilitiamo il supporto ai namespace
                factory.setNamespaceAware(true);
                //Si crea l'XmlPullParser dal factory
                XmlPullParser parser = factory.newPullParser();
                //Si passa il file da parsare come input
                parser.setInput(new FileInputStream(file),null); //NULLPOINTEREXCEPTION
               
                //omesso il resto dell'algoritmo
        }
    }


    private void calculatesLength() {
        for(int i=0; i < coordinates.size() - 1; i++) {
            LatLng firstLatLng = coordinates.get(i);
            LatLng secondLatLng = coordinates.get(i+1);
            length += Utilities.getInstance().getDistance(firstLatLng,secondLatLng);
        }
    }
}
Ottengo NullPointerException alla riga:
Codice: [Seleziona]
parser.setInput(new FileInputStream(file),null);

Però le log che ho messo non indicano che il file è nullo. Questo è il risultato del logcat:

Codice: [Seleziona]
06-17 11:52:18.136  30669-31519/com.loris.stefano.easyroutes E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)
     Caused by: java.lang.NullPointerException: file == null
            at java.io.FileInputStream.<init>(FileInputStream.java:76)
            at com.loris.stefano.easyroutes.model.Gpx$ParserAsyncTask.doInBackground(Gpx.java:82)
            at com.loris.stefano.easyroutes.model.Gpx$ParserAsyncTask.doInBackground(Gpx.java:49)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)
06-17 11:52:18.986  30669-30669/com.loris.stefano.easyroutes E/WindowManager﹕ Activity com.loris.stefano.easyroutes.main.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42672880 that was originally added here
    android.view.WindowLeaked: Activity com.loris.stefano.easyroutes.main.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42672880 that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:378)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
            at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
            at android.view.Window$LocalWindowManager.addView(Window.java:547)
            at android.app.Dialog.show(Dialog.java:285)
            at android.app.ProgressDialog.show(ProgressDialog.java:116)
            at android.app.ProgressDialog.show(ProgressDialog.java:99)
            at com.loris.stefano.easyroutes.model.Gpx$ParserAsyncTask.onPreExecute(Gpx.java:59)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
            at android.os.AsyncTask.execute(AsyncTask.java:534)
            at com.loris.stefano.easyroutes.model.Gpx.build(Gpx.java:43)
            at com.loris.stefano.easyroutes.model.AbstractTrack.<init>(AbstractTrack.java:35)
            at com.loris.stefano.easyroutes.model.Gpx.<init>(Gpx.java:32)
            at com.loris.stefano.easyroutes.main.MainActivity.onActivityResult(MainActivity.java:839)
            at android.app.Activity.dispatchActivityResult(Activity.java:5192)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3158)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3205)
            at android.app.ActivityThread.access$1100(ActivityThread.java:138)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:4787)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
            at dalvik.system.NativeStart.main(Native Method)

Potete aiutarmi a capire cortesemente? Grazie  :-)

Ps: non so cosa ho combinato ma il logcat non mi mostra più le eccezioni lanciate dall'applicazione.
« Ultima modifica: 17 Giugno 2014, 14:36:08 CEST da Elmvor »