应用程序类中的Android ArrayList

时间:2011-09-15 12:15:49

标签: class arraylist android

我正在尝试在ArrayList类上传递Application,但在填充这些列表时,即使列表已初始化,也会得到nullpointerexception。我的应用程序类是:

public class appCyberesa extends Application{

    private ArrayList<Marchand> HProviders ;//= new ArrayList<Marchand>();
    private ArrayList<CarAgency> CProviders ;//= new ArrayList<CarAgency>();
    private ArrayList<Agency> Agencies ;//= new ArrayList<Agency>();
    public GeoPoint Tunisie = new GeoPoint(microdegrees(36.80023),microdegrees(10.186073));
    private GeoPoint myLoc;

    @Override
    public void onCreate() {



    }

    private static int microdegrees(double value){
        return (int)(value*1000000);
    }

    public void setMyLoc(GeoPoint myLoc) {
        this.myLoc = myLoc;
    }

    public GeoPoint getMyLoc() {
        return myLoc;
    }

    public void setHProviders(ArrayList<Marchand> hProviders) {
        HProviders = new ArrayList<Marchand>();
        HProviders.addAll(hProviders);
    }

    public ArrayList<Marchand> getHProviders() {
        return HProviders;
    }

    public void setCProviders(ArrayList<CarAgency> cProviders) {
        CProviders = new ArrayList<CarAgency>();
        CProviders.addAll(cProviders);
    }

    public ArrayList<CarAgency> getCProviders() {
        return CProviders;
    }

    public void setAgencies(ArrayList<Agency> agencies) {
        Agencies = new ArrayList<Agency>();
        Agencies.addAll(agencies);
    }

    public ArrayList<Agency> getAgencies() {
        return Agencies;
    }
}

以下是导致NullPointerException:

appCyberesa myApp = ((appCyberesa)this.getApplication());
...
//the error occurs here
myApp.setHProviders(Marchands);
myApp.setCProviders(CarRenters);
myApp.setAgencies(Agencies);

这是堆栈跟踪:

09-15 13:59:19.284: ERROR/AndroidRuntime(761): java.lang.RuntimeException: An error occured while executing doInBackground()
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.lang.Thread.run(Thread.java:1096)
09-15 13:59:19.284: ERROR/AndroidRuntime(761): Caused by: java.lang.NullPointerException
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at com.cyberesa.info.Splash$ProgressTask.doInBackground(Splash.java:70)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at com.cyberesa.info.Splash$ProgressTask.doInBackground(Splash.java:1)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-15 13:59:19.284: ERROR/AndroidRuntime(761):     ... 4 more

和ligne(Splash.java:70)是:myApp.setHProviders(Marchands);

@Peter:Hole splash.java:

package com.cyberesa.info;


import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class Splash extends Activity {
    ArrayList<Marchand>Marchands = new ArrayList<Marchand>();
    ArrayList<CarAgency> CarRenters = new ArrayList<CarAgency>();
    ArrayList<Agency> Agencies = new ArrayList<Agency>();
    appCyberesa myApp = ((appCyberesa)this.getApplication());
    MyProgressDialog dialog;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        dialog = MyProgressDialog.show(this, null, null);
        new ProgressTask(Splash.this).execute();
    }

    private class ProgressTask extends AsyncTask<String, String, Boolean> {
        //private Splash activity;


        public ProgressTask(Splash splash) {
            //this.activity = splash;
            //context = splash;
        }

        /** application context. */
        //private Context context;

        protected void onPreExecute() {

        }

        protected void onCancelled (){

        }

        @Override
        protected void onPostExecute(final Boolean success) {
            dialog.dismiss();
            Intent newIntent = new Intent(Splash.this, Main.class);
            Splash.this.startActivity(newIntent);
        }


        protected void onProgressUpdate(String... msg) {

         }

        protected Boolean doInBackground(final String... args) {
            Log.v("Splash","Loading Hotels providers");
            HComparatorParser HParser = new HComparatorParser();
            Marchands=HParser.parse("t");
            Log.v("Splash","Loading Car providers");
            CComparatorParser CParser = new CComparatorParser();
            CarRenters = CParser.parse(0);
            Log.v("Splash","Travel Agencies");
            AgencyParser AParser=new AgencyParser();
            Agencies=AParser.parse();
            appCyberesa.setHProviders(Marchands);
            appCyberesa.setCProviders(CarRenters);
            appCyberesa.setAgencies(Agencies);

            return true;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

为什么需要创建一个空列表并再次添加项目?设置??

时,hProviders也为空
public void setHProviders(ArrayList<Marchand> hProviders) {
        HProviders = hProviders;
}

答案 1 :(得分:0)

此行生成NullPointerException

HProviders.addAll(hProviders);

,因为当您致电

Marchandnull
myApp.setHProviders(Marchands);

确保Marchand不为空或更好,请遵循Teja Kantamneni的建议。

答案 2 :(得分:0)

您需要在myApp中初始化变量onCreate()。您当前正在创建实例时初始化此变量,如下所示:

appCyberesa myApp = ((appCyberesa)this.getApplication());

问题是,在创建Splash实例时,对getApplication()的调用将返回null,因为尚未设置必要的底层框架(这所有这些都发生在调用onCreate()之前的构造函数中)。只需将初始化移至onCreate(),您就会很好。