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 e creo un'istanza della classe Gpx:
codice:
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
La classe Gpx si occupa di inizializzare una lista tramite un AsyncTask utilizzando il file passato come parametro:
codice:
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 indicata. Il file però non mi sembra nullo, le varie stampe stampano bene!
codice:
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)