我在我的模块类中有一组@Singleton和@Provides方法,用于在整个应用程序中创建Singleton实例.一切都很好,除了几个瓶颈情况,如下所示:
步骤1.我正在OKHttpClient使用Auth令牌创建一个Retrofit实例,以便每次都进行经过身份验证的api调用(通过处理Auth令牌检索和插入SharedPreferences).但是,在我通过清除数据库和共享首选项值注销应用程序之后重新启动活动时,问题就开始了.
步骤2.注销后,我正在另一个请求获取auth令牌并SharedPreferences再次插入以供将来使用.
第3步:现在,如果我继续进行其余的api调用,则前面的Dagger @Singleton和@Provides方法实例保持相同,除非直到我通过从最近的任务中清除它来重新启动应用程序.(新的身份验证令牌未更新)
需要修复:
如何触发Dagger提供程序方法强制再次触发或撤消它?
是否有任何方法可以像应用程序重新启动时那样刷新应用程序类数据.
请找到我项目中使用的Dagger 2架构:
NetworkModule.java(Dagger Module类)
@Module
public class NetworkModule {
private Context context;
public NetworkModule(Application app) {
this.context = app;
}
@Provides
@Named("network.context")
Context providesContext() {
return context;
}
@Singleton
@Provides
OkHttpClient providesOkHttpClient(@Named("network.context")final Context context) {
final UserProfile userProfile = GsonUtils.createPojo(SharedPrefsUtils.getString(Constants.SHARED_PREFS.USERS_PROFILE, "",context), UserProfile.class);
Logger.i(userProfile != null && !TextUtils.isEmpty(userProfile.getAuth_token()) ? userProfile.getAuth_token() : "----OAuth token empty---");
OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种简单的方法来确保static final boolean DEBUG在将我的Android项目导出到APK时将我的标志设置为false.
我已经尝试过使用这里提到的"STOPSHIP"评论标记,但它似乎对apk导出没有任何影响,或者我使用它错了.
为此目的建立一个lint扩展看起来有点过分,有没有更简单的方法呢?
编辑
使用自动生成的BuildConfig.DEBUG标志,结合一些难以错过的屏幕指示,你在调试模式下运行(加上心理记录永远不会在快速修复后凌晨4点上传apk) - 可能会让你满意.
但它仍然不是我发布此问题的100%万无一失的方法.
仍然存在关于随机无法正常运作的抱怨BuildConfig.DEBUG.所以这个问题仍然是开放的 - 是否有一个lint技巧或类似的技巧呢?
我希望这只是我在这里做错了.我正在尝试使用Dagger 2.0为我的JUnit测试注入依赖项(不是Espresso测试,只是纯JUnit).所以,我有一个'主'java模块和'测试'java模块.在主模块中,我有一个Dagger模块和一个组件:
@Module
public class MainModule {
@Provides
public Widget provideWidget() {
return new ConcreteWidget();
}
}
...
@Component (modules = MainModule.class)
public interface MainComponent {
void inject(WidgetConsumer consumer);
}
Run Code Online (Sandbox Code Playgroud)
在我的测试模块中,我有以下内容:
@Module
public class TestModule {
@Provides public Widget provideWidget() {
return new Widget() {
@Override
public void doThing() {
int y = 6;
y ++;
}
};
}
}
...
@Component(modules = TestModule.class)
public interface TestComponent extends MainComponent{
}
Run Code Online (Sandbox Code Playgroud)
我的build.gradle有依赖关系,如下所示:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习dagger2,面对一个看起来像个bug的奇怪问题.这是模块:
@Module
public class SimpleModule {
@Provides
Cooker providerCooker() {
return new Cooker("tom", "natie");
}
}
Run Code Online (Sandbox Code Playgroud)
零件:
@Component(modules = SimpleModule.class)
public interface SimpleComponent {
void inject(DaggerTestActivity activity);
}
Run Code Online (Sandbox Code Playgroud)
接口:
public interface CoffeeMaker {
String makeCoffee();
}
Run Code Online (Sandbox Code Playgroud)
执行:
public class SimpleMaker implements CoffeeMaker {
Cooker mCooker;
@Inject
public SimpleMaker(Cooker cooker) {
this.mCooker = cooker;
}
@Override
public String makeCoffee() {
return mCooker.makeCoffee();
}
}
Run Code Online (Sandbox Code Playgroud)
电饭煲:
public class Cooker {
String name;
String coffeeKind;
public Cooker(String name, String coffeeKind) {
this.name = …Run Code Online (Sandbox Code Playgroud) 当我添加以下代码时出现错误:
@Singleton @Provides fun provideGson() : Gson {
return Gson()
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道为什么.
要从数据库中获取数据,我CursorLoader在应用程序中使用.一旦onLoadFinished()回调方法调用app的逻辑,就将Cursor对象转换为List业务模型需求中的对象.如果有大量数据,那么转换(繁重操作)需要一些时间.这会降低UI线程的速度.我尝试Thread使用RxJava2传递Cursor对象在非UI中启动转换,但得到Exception:
Caused by: android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
Run Code Online (Sandbox Code Playgroud)
这是Fragment代码的一部分:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
QueryBuilder builder;
switch (id) {
case Constants.FIELDS_QUERY_TOKEN:
builder = QueryBuilderFacade.getFieldsQB(activity);
return new QueryCursorLoader(activity, builder);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (cursor.getCount() > 0) {
getFieldsObservable(cursor) …Run Code Online (Sandbox Code Playgroud) 我的笔记本电脑没有nVidia显卡,我想开发CUDA.该网站称,CUDA也可用于非cuda硬件的仿真模式.但是,当我尝试安装从他们的网站下载的CUDA驱动程序时,它会出现错误"nvidia安装程序找不到任何与您当前硬件兼容的驱动程序.安装程序现在将退出".
此外,当我尝试从Visual Studio 2008中的SDK运行示例代码时,我收到一个错误,即找不到.obj文件.
所以,我注意到有趣的问题.当我以编程方式添加新片段时,OnBackStackChangedListener中的onBackStackChanged方法被调用两次,但它必须只调用一次.这是我的活动代码:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener{
private FragmentManager fragmentManager;
private Button button1;
private Button button2;
private Button button3;
private Fragment defaultFragment;
private Fragment previousFragment;
private Fragment currentFragment;
private String currentFragmentTag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showFragment(new FragmentOne(), FragmentOne.TAG);
}
}); …Run Code Online (Sandbox Code Playgroud) 目前,在Android中,要根据时间或任何其他因素(如充电状态,网络状态等)定期执行任务,基本的三个选项是:Android AlarmManager (根据时间定期工作),GCMTaskService (需要设备上的Google Play服务) )和JobScheduler (需要Android版本> 21).最近,我遇到了这两个用于安排工作的库,一个来自Firebase,另一个来自Evernote.
我的主要问题是:这两个库如何比较?他们的优点和缺点是什么?
我想建立一个应用程序,提醒用户在一段时间后定期服用药物.
我的第二个问题是:简单的AlarmManager是否足够用于此目的,或者我应该选择这两个库中的任何一个?
谢谢.
android alarmmanager android-jobscheduler firebase-job-dispatcher android-job
我JobService这样扩展:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
整个类代码以黄色突出显示。
警告说:
指定 WorkManager 使用的作业 ID 的有效范围。
我做错了什么以及我应该做什么?
android ×8
java ×6
dagger ×3
dagger-2 ×3
alarmmanager ×1
android-job ×1
android-lint ×1
android-view ×1
cuda ×1
gson ×1
inheritance ×1
jobservice ×1
junit ×1
kotlin ×1
lint ×1
nvidia ×1
rx-android ×1
rx-java ×1
sqlite ×1