在刷新后,新的Runnable线程卡不会被删除

时间:2017-05-16 05:54:46

标签: java android multithreading

我在gridlayoutmanager中有卡片视图。我已经实现了滑动,即当我向上滑动卡片被解雇时。我的应用程序运行良好,直到我将该代码放入新线程中以提高性能。 当我这样做时,卡片被移除但是它在2-3秒后再次出现。 最初,当我刷卡时,卡会被解雇,下一张卡会出现。

我的代码:

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.UP )
        {

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
            {
                Toast.makeText(getApplicationContext(), "on Move", Toast.LENGTH_SHORT).show();
                return false;
            }

            @Override
            public void onSwiped(final RecyclerView.ViewHolder viewHolder, int swipeDir)
            {

                Toast.makeText(getApplicationContext(), "Task Status changed to COMPLETE", Toast.LENGTH_LONG).show();

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String username = getIntent().getStringExtra("username");
                        String password = getIntent().getStringExtra("password");
                        try {
                            restApi=new RallyRestApi(new URI("https://rally1.rallydev.com"),username,password);
                            JsonObject updatedValues = new JsonObject();
                            updatedValues.addProperty("State", "Completed");
                            UpdateRequest taskUpdate = new UpdateRequest(data_list.get(viewHolder.getAdapterPosition()).getRef(), updatedValues);
                            restApi.update(taskUpdate);
                            data_list.remove(viewHolder.getAdapterPosition());
                            adapter.notifyDataSetChanged();
                        } catch (URISyntaxException | IOException e) {
                            e.printStackTrace();
                        }


                    }
                });
            }
        };
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(recyclerView);

2 个答案:

答案 0 :(得分:0)

您应该只在主线程(UI线程)上调用adapter.notifyDataSetChanged()

请参阅此SO thread

答案 1 :(得分:0)

使用runOnUiThread()方法从非UI线程执行UI操作。

private class ReceiverThread extends Thread {
@Override
public void run() { 
Activity_name.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
             mAdapter.notifyDataSetChanged();
        }
    });
}

您无法从其他线程触摸UI的视图。对于您的问题,您可以使用AsyncTask,runOnUiThread或handler。