Android dagger2空指针异常

时间:2017-06-16 13:47:00

标签: android dependencies dagger-2

详细

我在Userdaoimpl上得到一个空指针异常,而usig包含Value和dbhelper对象.Userdaoimpl扩展了baseActivity,其中所有注入都已完成。如果我在MainActivity上使用ContainValue对象,那么containsValue(object)不包含null。问题是如果我在Userdaoimpl类上使用dbhelper和containsValue对象,那么它显示空指针异常,但我已经处理了该异常。

AppComponent

@Singleton @Component(modules={AppModule.class})
public interface AppComponent{
void inject(DaggerApplication application);
void inject(BaseActivity baseActivity);
}

的AppModule

@Module
public class AppModule{
private final DaggerApplication application;
public AppModule(DaggerApplication application){
this.application = application;
}
@Provides @Singleton
Context providesApplicationContext(){return application;}
@Provides @Singleton
Context providesApplicationContext(){return application;}
@Provides @Singleton
SharedPreferences providesSharedPreferences(Context app){
return app.getSharedPreferences("MY_Prefs_Title",Context.MODE_PRIVATE)
;}
@Provides @Singleton
Resources provideResources(){
return application.getResources();
}
@Singleton @Provides
Dbhelper providesDbhelper(){
return new Dbhelper(application);
}
@Singleton @Provides
ContentValues provideContainValues(){
return new ContentValues();
}
@Singleton @Provides
User provideUserObject(){
return new User();
}
@Singleton @Provides
Userdao provideUserDaoimpl(){
return new Userdaoimpl();
}}

public static final String DATABASE_NAME = "dragle_database";
public static final Integer DATABASE_VERSION = 1;
public static final String TABLE_NAME = "dagger";
public static final String FIRST_NAME ="first_name";
public static final String LAST_NAME ="last_name";
public static final String  ID = "id";
}

userDAO的

public interface Userdao{public boolean insertData(User user);}

在UserDAOImpl

public class Userdaoimpl extends BaseActivity implements Userdao{
@Override
public boolean insertData(User user){
try{
contentValues.put(Constant.FIRST_NAME,user.getFirstname());
contentValues.put(Constant.LAST_NAME,user.getLastname());
dbhelper.getWritableDatabase().insert(Constant.TABLE_NAME,null,content
Values);
dbhelper.close();
return true;}
catch (Exception e){
Log.e("Exception",e.getMessage());
return false;
}
finally{
try{dbhelper.close();
}catch(Exception e)
Log.e("Exception",e.getMessage());
}
}}}

Dbhelper

public class Dbhelper extends SQLiteOpenHelper{
public Dbhelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Strng query ="CREATE TABLE IF NOT EXISTS "
+ Constant.TABLE_NAME + "("
+ Constant.ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ Constant.FIRST_NAME + " VARCHAR(20), "
+ Constant.LAST_NAME + " VARCHAR(50))";
sqLiteDatabase.excSQL(query);
             sqLiteDatabase.execSQL(query);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase,int i,int i1){
}
}

用户类

public class User{
public String getFirstname(){
return firstname;
}
public User(String firstname,String lastname){
this.firstname = firstname;
this.lastname = lastname;
}
public void setFirstname(String firstname){
this.firstname = firstname;
}
public String getLastname(){
return lastname;
}
public void setLastname(String lastname){
this.lastname = lastname;
}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
private String firstname;
private String lastname;
private id id;
public User(){}
}

BaseActivity

public class BasActivity exteds AppComatActivity{
@Inject
public ContentValues contentValues;
@Inject
public Dbhelper dbhelper;
@Inject
Userdao userdao;
@Inject
User user;
@Inject
public SharedPreferences prefs;
@Inject
public Context context;
@Inject
Resources res;
@Override
public void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
((DaggerApplication)getApplication()).getAppComponent().inject(this);
}
}

DaggerApplication

public class DaggerApplication extends Application{
AppComponent appComponent;
@Override
public void onCreate(){
super.onCreate();
appComponent =
DaggerAppComponent.builder().appModule(new AppModule(this).build();
appComponent.inject(this);
}
public AppComponent getAppComponent(){return appComponent;}
}

MainActivity

public class MainActivity extends BasActivity{
private TextView textView;
@Override
public void onCreate(Bundle saveInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.textview1);//this is from myxml
prefs.edit().putInt("Number",6).apply();
textView.setBackgroundColor(res.getColor(android.R.color.holo_red_dar
));
Toast.makeText(context,"onCreate:"The value is Number is"+String
.valueOf(prefs.getInt("Number",0)),Toast.LENGTH_SHORT).show();
userdao.insertData(user);
user.setFirstname("Machhindra");
user.setLastname("Neupane");
if(userdao.inserData(user)){
Toast.makeText(context,"data inserted",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(context,"data not inserted",Toast.LENGTH_SHORT).show();
}}}

1 个答案:

答案 0 :(得分:0)

而不是@providing一个BaseActivity并将Userdaoimpl作为其多态基类传递到生成的Dagger组件中,只需@provide一个UserdaoimplUserdaoimpl@provided然后匕首就可以注射它。