Articles of java

在Android中与Java的抽象

我正在学习一些关于Java语言的教程。 我在想,如果每次我编码的东西,以及任何types的标准和堆栈,我是否应该抽象? 我已经看到,例如每个Spring服务,我们甚至可以抽象控制器,使用JavaEE堆栈上的EJB接口。 我想知道那是什么目的? 我应该在使用Android SDK进行开发时做同样的事情吗? 我应该抽象每一个我编码的类吗?

匕首2和界面的实现

我有一个简单的Dagger 2testing设置,基于http://konmik.github.io/snorkeling-with-dagger-2.html 。 它注入一个PreferenceLogger,输出所有的偏好。 在注入的类中,我可以@注入更多的类。 public class MainActivity extends Activity { @Inject PreferencesLogger logger; @Inject MainPresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { MyApplication.getComponent().inject(this); presenter.doStuff(); logger.log(this); } } public class PreferencesLogger { @Inject OkHttpClient client; @Inject public PreferencesLogger() {} public void log(Contect context) { // this.client is available } } 当我运行这个,logging器被设置,并在PreferencesLogger.log OkHttpClient被正确设置。 所以这个例子按预期工作。 现在我正在尝试获得一个MVP结构。 有一个MainPresenter接口和一个实现。 […]

Android中的静态字段

我在android和java开发新手,我想了解一些事情。 在活动和片段之间使用静态字段传输数据是不好的做法吗? 对我来说,这比在意图中使用临时演员要容易得多。 为什么很多程序在构造函数和方法中使用上下文作为参数,当我们可以使用静态字段对应用程序上下文进行一点访问? 例如: public class ApplicationLoader extends Application { public static volatile Context context; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); } } 所以有人可以解释,在哪些情况下应该使用android中的静态字段(我的意思是适配器,列表,上下文等类)? 而当使用非静态字段,getters / setters,额外的意图是更好的方式,然后静态字段?

RxJava:找出BehaviorSubject是否是重复的值

我正在制作一个Android界面,显示从networking中获取的一些数据。 我想让它显示最新的可用数据,并永远不会是空的(除非根本没有数据被提取),所以我使用BehaviorSubject为订户(我的用户界面)提供最新的可用信息,同时刷新它更新它的背景。 这是有效的,但由于我的用户界面的另一个要求,我现在必须知道发布的结果是否从networking获得新鲜或不。 (换句话说,我需要知道发布的结果是否为BehaviorSubject的保存项目。) 我怎样才能做到这一点? 如果我需要将它分解为多个Observables,那就好,只要我能够获得BehaviorSubject的caching行为(获取最后的可用结果),同时也能够判断返回的结果是来自caching还是不。 我认为这样做的一个拙劣的方法是检查响应的时间戳是否相对较快,但是这实在是太渺茫了,我宁愿想办法用RxJava来完成。

android片段子类中的getMenuInflater() – 无法parsing方法

我正在尝试在inheritanceFragment类的类中充气菜单。 这是我的OnCreateOptionsMenu()方法 – @Override public boolean OnCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.forecastfragment, menu) ; return true; } 这引发了以下错误: 无法parsing方法'getMenuInflater()' 我试过了 : MenuInflater inflater = getActivity().getMenuInflater(); 但是之后Android Studio突出显示了红色的@Override并指出: 方法不会覆盖超类的方法 我也尝试在同一个类中创build一个getMenuInflater方法,并让它返回new MenuInflater(this) public MenuInflater getMenuInflater() { return new MenuInflater(this); } 但是随后出现以下错误: 错误:不兼容的types:ForecastFragment不能转换为上下文 错误:方法不会覆盖或实现超types的方法 我该怎么办?

Android中的Date应该使用什么类?

我目前正在为Android做一个应用程序,但我不确定哪个类最好用。 我需要处理的date是诸如比较date,获得date之间的差异以及date计算(比如添加/减less诸如两周或一个月的一小段时间任何给定的date)。 我知道在Java API中的标准Date类是可怕的,所以我只是想知道哪些类被推荐? 我见过GregorianCalendar类和Joda时间库。 不过,由于Joda时间库的大小,我读了一篇文章,不推荐用于应用程序。 任何帮助将非常感激。 ^^ 编辑:从404notfound评论,我决定去日历界面。 这是由于日历界面自动使用基于用户设备的区域设置和时区的最佳实现。 这可以使它在实现GregorianCalendar(或其他特定的实现)方面更灵活,就地点而言, 希望这对于有同样难题的任何人都有帮助! 编辑#2:进一步查看NguyễnHoàiNam提供的链接之后,我已经使用了ThreeTenABP库,因为它是Java 8中新的Time类的封装,并且将被certificate比使用更stream畅日历方法。

何时调用response.body()。close()

我有一个使用OkHttp的Android SDK。 在我的示例应用程序使用我的SDK一切工作正常。 然而,我的一个用户,当StrictMode打开时,得到以下的java.lang.Throwable: Explicit termination method 'close' not called 。 我已经尝试在我自己的应用程序与StrictMode复制这个,不要得到这个错误。 我明白,我应该调用response.body().close()但我仍然有点困惑,为什么这不是在我的应用程序中发生。 他发给我的堆栈跟踪只有我的类,所以它似乎没有任何东西在他的代码造成的。 另外值得注意的是,只有一个请求我的SDK实际上有响应读取。 但是这不是我的用户所说的引起exception的请求。 还有什么可能导致这个? 什么时候应该调用.close() ? 调用execute()后立即调用它是可取的吗? closures身体会阻止它在未来被阅读吗?

material-calendarview设置date的背景颜色

我的目标是find一个Android库,这将允许我在日历视图上标记基于数组的各种date。 date可能是连续的,也可能不是连续的。 我的理想场景是更改每个date的背景颜色。 重要的复杂性是,我不知道这种颜色,直到运行时,因为它将来自服务器查询。 我一直在研究这一整天,我最好的希望似乎是material-calendarview ( github )。 但是,我发现他们的代码有点难以理解,这是对我的,但我完全卡住了。 我在我的XML布局中添加了这样的日历: <com.prolificinteractive.materialcalendarview.MaterialCalendarView android:id="@+id/calendar_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" xmlns:app="http://schemas.android.com/apk/res-auto" app:mcv_showOtherDates="all" app:mcv_selectionColor="#00F"/> 然后在我的活动中,我有这些实例variables: private MaterialCalendarView calendarView; private ArrayList<Date> markedDates; 和这个代码在我的onCreateView() calendarView = (MaterialCalendarView) view.findViewById(R.id.calendar_view); 好吧,很简单。 但我不知道如何从date数组中标记日历。 我正在研究这个方法,但是我只是不知道如何超越我在这里的范围: private void initializeCalendar() { calendarView.setOnDateChangedListener(context); calendarView.setShowOtherDates(MaterialCalendarView.SHOW_ALL); Calendar calendar = Calendar.getInstance(); calendarView.setSelectedDate(calendar.getTime()); calendar.set(calendar.get(Calendar.YEAR), Calendar.JANUARY, 1); calendarView.setMinimumDate(calendar.getTime()); calendar.set(calendar.get(Calendar.YEAR), Calendar.DECEMBER, 31); calendarView.setMaximumDate(calendar.getTime()); int bgColor […]

与Mockito的Android仪器testing

我试图使用Android仪器testingMockito框架,但我不能正确初始化它。 我有以下testing类: class MainKontorTest extends ActivityInstrumentationTestCase2<MainActivity> { @Mock Dependency bar; @Override public void setUp() { super.setUp(); MockitoAnnotations.initMocks(this); } public void testSomething() { Foo foo = new Foo(bar); } } 当我尝试运行这个testing时,我得到以下错误和stacktrace: java.lang.ExceptionInInitializerError org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)at org。 mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)at org.mockito.internal.util.MockUtil。在org.mockito.internal.MockAnnotationProcessor的org.mockito.Mockito.Mock(Mockito.java:1285)上的org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)上的createMock(MockUtil.java:33) (org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)处理(MockAnnotationProcessor.java:33)。 mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEn (org.mockito.java:66)org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)at org.mockito.MockitoAnnotations .initMocks(MockitoAnnotations.java:108)at junit.framework.TestCase.runBare(TestCase.java:132)at junit.framework。org.arkadiy.moduledeleationsample.ui.main.MainKontorTest.setUp(MainKontorTest.java:20)。 TestResult $ 1.protect(TestResult.java:115)at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)at junit.framework.TestResult.run(TestResult.java:118)at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55),位于android.support.test.internal.runner.junit3的junit.framework.TestCase.run(TestCase.java:124)。 NonLeakyTestSuite $ NonLeakyTest.run(NonLeakyTestSuite.java:63)在junit.framework.TestSuite.runTest(TestSuite.java:24 3)在android.support.test.internal.runner的android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)上的junit.framework.TestSuite.run(TestSuite.java:238) .org.junit.runners.Suite.runChild(Suite.java)中的。 […]

如何知道BLE设备何时在Android上订阅特性?

从iOS开发背景来看,当使用蓝牙LE充当外设时,当“中央”BLE设备为特性订阅(启用通知)时,您可以注册callback。 我正在努力看到如何在Android上实现。 如果您正在使用蓝牙LE作为中心,我可以看到您将如何订阅: bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true); 这与iOS上的相同: peripheralDevice.setNotifyValue(true, forCharacteristic characteristicToSubscribeTo) 现在,在iOS上调用上述内容之后,在外围设备上,您将获得一个callback,说中央已经订购了一个类似于: peripheralManager(manager, central subscribedCentral didSubscribeToCharacteristic characteristic) ,然后为您提供订阅设备的参考/启用通知和什么特征。 Android上的等效物是什么? 为了清楚起见,我将指出,我不需要订阅Android上的特性,设备充当外设,并且在其他设备订阅特性时需要得到通知。 对不起,如果这是显而易见的,但我不能在文档或其他地方find它。