我正在制作一个安卓库.在我的库中,我想允许用户在后台或主线程中执行特定任务.
我想做这样的事情.
第一种情景
MyLibabry.with(context)
.performSomeTask(<params>)
.execute();
Run Code Online (Sandbox Code Playgroud)
当用户编写上述代码段时.任务应该在后台执行.所以我将使用任何监听器返回任务的结果.
现在考虑下面的代码段.
第二种情景
Result result = MyLibabry.with(context)
.performSomeTask(<params>)
.get();
Run Code Online (Sandbox Code Playgroud)
现在,当用户在语句末尾附加get()时.该任务应该在主线程上执行并阻止其他线程.这就是结果立即初始化的原因.
所以我的问题是我如何实现如果用户附加.get()的功能,那个线程performSomeTask()
应该在主线程上运行.否则在后台.
注意:不要专注于返回结果.我将在Java Generics中实现它.我想知道的是如何使代码可重用,以便当用户只附加.get()
它时将在主线程上运行.否则相同的代码应该在后台运行.我不想写重复的代码.
您可以参考现有的库.
所以两个库具有相同的功能,并且还有更多的库可以做同样的事情,我想做同样的事情.
如果有人为我提供一个小例子,那就太好了.
考虑我在我的android项目中有两个产品风味名为'local'和'international'. 我只是给出了我的情况的骨架,所以请不要理会其他错误. 考虑到我已经有不同的源Set为不同的味道.
现在我的'本地'味道我只需要下面提到的一种方法.
// local flavor file
interface UserDao {
List<User> getAllUser();
}
Run Code Online (Sandbox Code Playgroud)
虽然在我的国际风格,我还需要其他功能,以使用户也可以通过其名称进入组.所以有两种方法.
// international flavor file
interface UserDao {
List<User> getAllUser();
List<User> getAllUserGroupByName();
}
Run Code Online (Sandbox Code Playgroud)
但问题是,
我正在调用该方法的单个活动.
当我getAllUserGroupByName()
从活动中调用方法时,如果当前的味道是' 国际 ',它将编译,但它不会编译' 本地 '味道,因为它不包含该方法.
我尝试通过如下条件包装来调用此方法,
// BuildUtils is my helper class to get current flavor check easily.
if (BuildUtils.isInternational()) {
getAppDatabase().UserDao().getAllUserGroupByName();
}
Run Code Online (Sandbox Code Playgroud)
但它也不起作用.
我不想要以下解决方案.
更新
经过@manouti的一些研究和回答
问题是Java是一种静态类型语言,因此放置if条件并不意味着编译器将避免使用getAllUserGroupByName调用来检查代码.
那么构建系统是否可以根据代码编译的风格忽略特定代码?
要么
任何Android工作室IDE工具或功能,将根据编译风格丢弃特定代码.
我正在使用嵌套的ArrayList for Tablayout.ArrayList的每个元素都会填充每个Tab.标签计数根据父级arraylist的大小而变化.例如,当父ArrayList的大小为2时,选项卡数为2; 当大小3标签计数3..etc..为了解释这种情况很困难,我准备了expalantion图像..
图片1
此图像代表一般外观.我想用ArrayLists为每个元素填充这个TextViews
图2
此图像代表我的数据类型; 键和值ArrayList是嵌套的arraylist,它们在每个索引中包含arraylist.
图3 - 图像4 - 图像5
这个图像代表了tabLayouts过去的样子.我希望我的数据看起来像这个图像.
所以问题是PopUpDetailsAdapterPlanT Class;
当我使用下面的代码时,每行填充相同的项目.对于此示例,每行写入ArrayList的最后一个元素(位置 - 明尼苏达州)如何处理此问题.谢谢你的帮助
public class PopUpDetailsAdapterPlanT extends ArrayAdapter {
Context context;
private ArrayList<ArrayList<Object>> keys;
private ArrayList<ArrayList<String>> values;
public PopUpDetailsAdapterPlanT(Context context, ArrayList<ArrayList<Object>> keys, ArrayList<ArrayList<String>> values) {
super(context,R.layout.popupdetails_listview_simpleitem);
this.keys = keys;
this.values = values;
this.context = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = …
Run Code Online (Sandbox Code Playgroud) 在继续前进之前,我在google上搜索这个bug,我发现了很多可用的答案,但我的情况与他们的情况不同.
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:3
Run Code Online (Sandbox Code Playgroud)
我使用recyclerview显示民意调查问题,每个问题都有一个计时器,当计时器用完时,项目将从列表中删除.
当计时器用完时会发生异常,但仅在极少数情况下,剩余较少的时间(前100毫秒).因此,在这种情况下,recyclerview可能是膨胀项目,同时,计时器运行并且recyclerview尝试删除该项目.
错误是当计时器删除项目我得到例外.
因此,当该轮询剩余1秒或更少时,我从数据集中删除元素后解决了这个问题.所以它不会在列表中添加项目,并且将运行计时器.
如果你想产生错误,只需启动倒数计时器,
bindView
并在计时器用完后删除该特定项目.你必须使计时器低于500毫秒.
所以现在一切都很完美.崩溃的罕见情况已经解决,但即使剩余的时间较少,我也不想从数据集中删除元素.请给我这个bug的正确解决方案.
编辑
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 1(offset:1).state:2 com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager{182da0c VFED..... .F....ID 0,0-720,1024 #7f0a01a1 app:id/recycler_view}, adapter:com.lsjwzh.widget.recyclerviewpager.RecyclerViewPagerAdapter@c9403f, layout:android.support.v7.widget.LinearLayoutManager@6fdbd0c, context:com.bitpoll.polls.MainActivity@b40f4c0
android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5817)
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:606)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:894)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
android.widget.FrameLayout.onLayout(FrameLayout.java:321)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982)
android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826)
android.widget.LinearLayout.onLayout(LinearLayout.java:1735)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
android.widget.FrameLayout.onLayout(FrameLayout.java:321)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982)
android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826)
android.widget.LinearLayout.onLayout(LinearLayout.java:1735)
android.view.View.layout(View.java:17969) …
Run Code Online (Sandbox Code Playgroud) 最近我展示了一个关于 androidX 测试的谷歌 IO 视频,其中引用了“一次编写,到处运行”。这让我很高兴了解 androidX 测试库。
我发现经过很长时间谷歌为开/关设备的单元测试和仪器测试提出了很好的单一库。但是我发现在开/关设备上运行相同的测试有些困难。
基本上在 Android 中,我们创建了两个源根test/java
,androidTest/java
分别存储单元测试和仪器测试。单元测试在 JVM 上运行,Instrumentation 在设备/模拟上运行。
然后我为test/java
目录中的片段之一编写了测试。
@RunWith(AndroidJUnit4::class)
class MyFragmenTest {
lateinit var scenario: FragmentScenario<MyFragment>
@Before
fun setUp() {
scenario = launchFragmentInContainer<MyFragment>()
}
@Test
fun `sample test`() {
scenario.onFragment {
// something
}
// some assertion
}
}
Run Code Online (Sandbox Code Playgroud)
所以当我使用小的绿色运行图标执行这个测试时,它在没有模拟器的 JVM 中运行这个测试,这很棒。但是要在设备上运行相同的测试,我必须移动此代码androidTest/java
源根目录。
基本上我得到了相同的测试可以在任何地方运行,当我们使用 androidX 测试库时,您不必依赖不同的工具和库来完成相同的工作。
我试过的。
之后,在 google 上搜索我发现我们必须sharedTest/java
使用下面的 gradle 行创建源根目录,以便它可以在设备上或设备外运行。
android {
...
sourceSets {
androidTest {
java.srcDirs += "src/sharedTest/java"
}
test …
Run Code Online (Sandbox Code Playgroud) android android-testing android-jetpack androidx androidx-test
请考虑以下代码:
Glide.with(<your_context>)
.load(<remote_file_url, local_file_path>)
.into(<imageview>);
Run Code Online (Sandbox Code Playgroud)
Glide代码上面写了很多文件.我只想在logcat中记录remote_file_url或local_file_path.但我不想更改每个文件中的代码.
Glide是否允许记录?如果它允许,那么我需要一个简单的中央方式来打开滑行记录.
供参考:我想要像Retrofit + okhttp
允许的方式.在OkHttp
,我只需要在一个位置添加拦截器,它将记录有关每个webservice调用的信息,而无需编写任何其他附加代码.
我一直在遵循这些说明:https : //developers.google.com/pay/passes/guides/get-started/basic-setup/get-access-to-rest-api
步调一致
- 从列表中选择您的帐户。显示帐户信息页面。
我找不到任何帐户,列出了 0 个帐户。如果我尝试创建一个帐户,我会收到一条错误消息“必须与颁发者共享服务帐户或用户”。
在那个有问题的步骤之前,我已经完成了所有要求。
你们中有人做过这个吗?有谁知道如何就此事联系谷歌?我已经通过我之前提供的网站向 Google 发送了反馈。
如何在圆弧的边缘添加小圆圈。
并且它也应该在时钟方向以弧边移动。
现在我使用改变扫描角度成功地为圆弧设置动画。
和黑点是剩余的。
下面是getView和animation类的代码
--- init method and implement constructor ----
mRectF = new RectF(mWidth / 2 - 360, mHeight / 2 - 360, mWidth / 2 + 360, mHeight / 2 + 360);
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//draw circle background
mPaint.setColor(getResources().getColor(R.color.timer_background_color));
canvas.drawCircle(mWidth / 2, mHeight / 2, 360, mPaint);
mPaint.setColor(getResources().getColor(R.color.actionbar_back_color));
canvas.drawArc(mRectF, mStartAnagle, mSweepAngle, false, mPaint);
}
public class TimerAnimation extends Animation{
public TimerAnimation (float startAngle, float sweepAngle, long duration) {
mStartAnagle = startAngle;
mSweepAngle = …
Run Code Online (Sandbox Code Playgroud)