小编Moi*_*han的帖子

如何使用android实现带有FutureTask或BackgroundTask的.get功能?

我正在制作一个安卓库.在我的库中,我想允许用户在后台或主线程中执行特定任务.

我想做这样的事情.

第一种情景

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()它时将在主线程上运行.否则相同的代码应该在后台运行.我不想写重复的代码.

您可以参考现有的库.

  • AsyncTask - 用于执行后台任务的Android官方.
  • ION - 用于下载/上传文件

所以两个库具有相同的功能,并且还有更多的库可以做同样的事情,我想做同样的事情.

如果有人为我提供一个小例子,那就太好了.

java multithreading android android-library

16
推荐指数
1
解决办法
1717
查看次数

无法解析不同风味android studio的方法'getAllUserGroupByName()'

考虑我在我的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工具或功能,将根据编译风格丢弃特定代码.

java android build gradle android-studio

12
推荐指数
1
解决办法
473
查看次数

如何将嵌套的ArrayList分割为TabLayout的每个布局

我正在使用嵌套的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)

android arraylist android-arrayadapter android-tablayout

11
推荐指数
1
解决办法
562
查看次数

RecyclerView:检测到不一致.商品位置无效.原因 - 使用计时器删除项目

在继续前进之前,我在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)

java android listview android-recyclerview

9
推荐指数
3
解决办法
2062
查看次数

Jetpack AndroidX 测试“一次编写,随处运行”——但在任何地方运行的最佳方式是什么?

最近我展示了一个关于 androidX 测试的谷歌 IO 视频,其中引用了“一次编写,到处运行”。这让我很高兴了解 androidX 测试库。

我发现经过很长时间谷歌为开​​/关设备的单元测试和仪器测试提出了很好的单一库。但是我发现在开/关设备上运行相同的测试有些困难。

基本上在 Android 中,我们创建了两个源根test/javaandroidTest/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

8
推荐指数
1
解决办法
170
查看次数

Glide:记录每个请求

请考虑以下代码:

Glide.with(<your_context>)
    .load(<remote_file_url, local_file_path>)
    .into(<imageview>);
Run Code Online (Sandbox Code Playgroud)

Glide代码上面写了很多文件.我只想在logcat中记录remote_file_urllocal_file_path.但我不想更改每个文件中的代码.

Glide是否允许记录?如果它允许,那么我需要一个简单的中央方式来打开滑行记录.

供参考:我想要像Retrofit + okhttp允许的方式.在OkHttp,我只需要在一个位置添加拦截器,它将记录有关每个webservice调用的信息,而无需编写任何其他附加代码.

java android picasso android-glide

7
推荐指数
1
解决办法
2637
查看次数

设置 Google Pay API for Passes

我一直在遵循这些说明:https : //developers.google.com/pay/passes/guides/get-started/basic-setup/get-access-to-rest-api

步调一致

  1. 从列表中选择您的帐户。显示帐户信息页面。

我找不到任何帐户,列出了 0 个帐户。如果我尝试创建一个帐户,我会收到一条错误消息“必须与颁发者共享服务帐户或用户”。

在那个有问题的步骤之前,我已经完成了所有要求。

你们中有人做过这个吗?有谁知道如何就此事联系谷歌?我已经通过我之前提供的网站向 Google 发送了反馈。

google-pay

6
推荐指数
1
解决办法
748
查看次数

在弧形机器人的边缘添加一个圆圈?

如何在圆弧的边缘添加小圆圈。
并且它也应该在时钟方向以弧边移动。
现在我使用改变扫描角度成功地为圆弧设置动画。
和黑点是剩余的。

在此处输入图片说明

下面是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)

math geometry android view android-custom-view

5
推荐指数
1
解决办法
2719
查看次数