未来的任务不能正常工作(Android)

时间:2016-12-29 09:01:24

标签: android multithreading animation future runnable

我想做一个'寻找'文字如下: "正在加载。" - > "正在加载.." - > "正在加载......"

然后一旦我获得某些数据,请停止此动画文本,然后将文本设置为"找到。"

我尝试以这种方式实现它:

@Component({
    selector: 'my-list',
    templateUrl: 'my-list.component.html',
    styleUrls: ['my-list.component.css']
})
export class MyListComponent implements OnInit {
  items: ItemModel[] = [];
}


@Component({
    selector: 'my-item',
    templateUrl: 'my-item.component.html',
    styleUrls: ['my-item.component.css'],
    animations: [
        trigger('itemState', [
            state('inactive', style({
                transform: `rotate(${DYNAMIC_DEGREE_VAR}deg)`
            })),
            state('active', style({
                transform: `rotate(0deg)`
            })),
            transition('inactive => active', animate('100ms ease-in')),
            transition('active => inactive', animate('100ms ease-out'))
        ])
    ]
})
export class MyItemComponent implements OnInit {

   item: ItemModel;

   state: string = 'inactive';
}

// ---------------------------------------------------------

// my-item.component.html
<div [@itemState]="state"></div>

// my-list.component.html
<my-item [item]="item" *ngFor="let items of item"></my-item>

然后我会运行这个过程:

ExecutorService threadPoolExecutor = Executors.newSingleThreadExecutor();
Future textAnimationTaskFuture;
Runnable textAnimationTask;

textAnimationTask = new Runnable() {
            @Override
            public void run() {
                int passedTime = 0;
                while(passedTime < 3000)
                {
                    if(passedTime < 1000){         
                       textView.setText("Loading.");
                    }
                    else if(passedTime >= 1000 && passedTime < 2000 )
                    {
                       textView.setText("Loading..");
                    }else if (passedTime >= 3000)
                    {
                       textView.setText("Loading...");
                    }
                    passedTime = passedTime + 1;
                    if( passedTime == 3000 )
                        passedTime = 0;
                }
            }
        };

取消它:

 textAnimationTaskFuture = threadPoolExecutor.submit(textAnimationTask);

不幸的是,循环不会在取消时停止(true)。

1 个答案:

答案 0 :(得分:0)

我不确切地知道它为什么不一致,但是你遇到的一个明显问题是你试图从一个线程而不是从UI线程改变一个视图。要将文本设置为视图,您需要执行以下操作:

 runOnUiThread(new Runnable() {
        @Override
        public void run() {
            textView.setText("MY_TEXT");
        }
    });

关于循环没有停止 - 我建议你调试它,从查看代码我无法检测到循环的任何问题。