如何使用Dagger?如何配置Dagger在我的Android项目中工作?
我想在我的Android项目中使用Dagger,但我发现它令人困惑.
编辑:Dagger2也从2015年04月15日开始,它更令人困惑!
[这个问题是一个"存根",我在我的答案中添加了更多关于Dagger1的知识,并且更多地了解了Dagger2.这个问题更多的是指导而不是"问题".
我想用lambda缩进实现的目的如下:
多行声明:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl)
.filter(
(x) ->
{
return x.contains("(M)");
}
).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
单行声明:
List<String> strings = Arrays.stream(ppl)
.map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)"))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
目前,Eclipse正在自动格式化为以下内容:
多行声明:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl).filter((x) ->
{
return x.contains("(M)");
}).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
单行声明:
String[] ppl …Run Code Online (Sandbox Code Playgroud) 我正在阅读GitHub上的Dagger2组件范围测试的源代码,我看到为被调用的活动定义了"自定义范围" @ActivityScope,但我在其他项目中看到了它,包括具有其范围的4模块CleanArchitecture@PerActivity.
但从字面上看,@ActivityScope注释的代码如下:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.inject.Scope;
/**
* Created by joesteele on 2/15/15.
*/
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
Run Code Online (Sandbox Code Playgroud)
它在模块中"神奇地"可用:
@Module
public class ActivityModule {
@Provides @ActivityScope Picasso providePicasso(ComponentTest app, OkHttpClient client) {
return new Picasso.Builder(app)
.downloader(new OkHttpDownloader(client))
.listener(new Picasso.Listener() {
@Override public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
Log.e("Picasso", "Failed to load image: " + uri.toString(), e);
}
})
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
或者CleanArchitecture …
我正在尝试按照网络指南使用Spring安全保护我的网站.所以在我的服务器端,WebSecurityConfigurerAdapter和控制器看起来像这样
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
implements ApplicationContextAware {
@Override
protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception {
authManagerBuilder.inMemoryAuthentication()
.withUser("user").password("password").roles("ADMI N");
}
}
@Controller
//@RequestMapping("/course")
public class CourseController implements ApplicationContextAware{
@RequestMapping(value="/course", method = RequestMethod.GET, produces="application/json")
public @ResponseBody List<Course> get(// The critirion used to find.
@RequestParam(value="what", required=true) String what,
@RequestParam(value="value", required=true) String value) {
//.....
}
@RequestMapping(value="/course", method = RequestMethod.POST, produces="application/json")
public List<Course> upload(@RequestBody Course[] cs) {
}
}
Run Code Online (Sandbox Code Playgroud)
令我困惑的是服务器没有响应POST/DELETE方法,而GET方法工作正常.顺便说一下,我在客户端使用RestTemplate.例外情况是:
Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 403 Forbidden
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) …Run Code Online (Sandbox Code Playgroud) "作为添加对Lambda表达式的支持的努力的一部分,简单地考虑将接口中的私有方法支持包含在Java SE 8中,但是为了更好地关注Java SE 8的更高优先级任务而被撤回.现在提议支持私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码."
所以说http://openjdk.java.net/jeps/213的规范, 并在错误报告https://bugs.openjdk.java.net/browse/JDK-8071453中说.
但是,即使有上面给出的简短解释,我也无法想到任何必要的用例.我可以问一个例子,"私有接口方法"在代码方面是否有用?
编辑:所以答案是,由于Java 8中的接口添加了默认实现,可能存在默认实现使用相同代码库的情况.
例如,
public interface MyInterface {
default void initializeMyClass(MyClass myClass, Params params) {
//do magical things in 100 lines of code to initialize myClass for example
}
default MyClass createMyClass(Params params) {
MyClass myClass = new MyClass();
initializeMyClass(myClass, params);
return myClass;
}
default MyClass createMyClass() {
MyClass myClass = new MyClass();
initializeMyClass(myClass, null);
return myClass;
}
}
Run Code Online (Sandbox Code Playgroud)
愚蠢的例子,我知道.但是,让我们说我们想要initializeMyClass(MyClass, Params)在两种方法中使用.但是,如果我们这样做(默认方法),那么initializeMyClass(MyClass, Params)将成为公共接口的一部分!为了防止这种情况发生,我们只能将整个代码保留initializeMyClass(MyClass, Params) …
我将Android Studio更新到最新版本,让它"修复项目"之类 - 但现在我的项目没有编译,给了我
FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
D:\VGA\AndroidStudio\sdk\build-tools\21.1.1\dx.bat --dex --no-optimize --output D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\dex\debug --input-list=D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\tmp\dex\debug\inputList.txt
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
at com.android.dx.command.dexer.Main.run(Main.java:245)
at com.android.dx.command.dexer.Main.main(Main.java:214)
at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)
但是,只有通过多索引才能解决这个问题,因为当我添加这个时:
defaultConfig {
...
multiDexEnabled = true
}
Run Code Online (Sandbox Code Playgroud)
有时候是这样的
D:\VGA\AndroidStudio\sdk\build-tools\21.1.1\dx.bat --dex --no-optimize --multi-dex …Run Code Online (Sandbox Code Playgroud) #Requires -Version 2.0
[CmdletBinding()]
Param(
[Parameter()] [string] $MyParam = $null
)
if($MyParam -eq $null) {
Write-Host 'works'
} else {
Write-Host 'does not work'
}
Run Code Online (Sandbox Code Playgroud)
输出"不起作用"=>看起来像字符串隐式地从空转换为空字符串?为什么?如何测试一个字符串是空的还是真的$ null?这应该是两个不同的值!
我知道OOP(面向对象编程)和SOLID.
和
但是,我不确定具体的区别是什么,以及SOLID是否是OOP的子集.谁能帮助解释这些差异?
我想使用PowerShell获取我的csproj文件中所有项目引用的列表.目前我有以下方法:
[xml]$csproj = Get-Content MyProject.csproj
$refs = $csproj.SelectNodes("//ProjectReference")
foreach($ref in $refs) {
# Later on output more useful information
Write-Host $ref.Name
}
Run Code Online (Sandbox Code Playgroud)
但是,尽管在给定的csproj文件中肯定存在ProjectReference元素,但脚本不会输出任何内容.以下是有效的:
[xml]$csproj = Get-Content MyProject.csproj
foreach($l in $csproj.Project.ItemGroup.ProjectReference) { Write-Host $l.Include }
Run Code Online (Sandbox Code Playgroud)
但是我以后也需要XPath +它为每个不包含ProjectReference的ItemGroup输出错误 - 那么如何使用SelectNodes函数使XPath工作?
示例XML(基本上任何带有项目引用的VS csproj文件都可以):
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup></ItemGroup>
<ItemGroup>
<ProjectReference Include="Text"></ProjectReference>
<ProjectReference Include="Text2"></ProjectReference>
</ItemGroup>
<ItemGroup></ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)