无法调用 runOnUiThread()

nif*_*ody 3 android android-viewholder okhttp3

我有一个名为 的片段MyRequestFragment,其中包含使用我的适配器类RecyclerView将数据绑定到RecyclerViewusing的片段onBindViewHolder()

现在每个ViewHolder我都有一个按钮。并且每次单击按钮都会POST向服务器发出请求并更新值。我的问题是,如果出现成功响应,我需要隐藏特定ViewHolder.

实际问题是runOnUiThread()不接受onBindViewHolder()

runOnUiThread(new Runnable() {
    public void run() {

    }
});
Run Code Online (Sandbox Code Playgroud)

我如何在ViewHolder创建/绑定方法中调用它。

我的onBindViewHolder()完整代码如下供参考。

@Override
    public void onBindViewHolder(MyServiceViewHolder holder, int position) {
        final MyServiceBean myServiceBean = serviceList.get(position);
        holder.service_name.setText(myServiceBean.getService_name());
        holder.last_updated.setText("Job Updated Date : " +myServiceBean.getDate(myServiceBean.getUpdated_at()));
        holder.created_date.setText("Job Created Date : " + myServiceBean.getDate(myServiceBean.getCreated_at()));
        holder.status.setText(myServiceBean.getStatus());
        holder.service_note.setText("Service Note : " + myServiceBean.getService_note());
        if (myServiceBean.getService_note().toString().isEmpty())
            holder.service_note.setVisibility(View.GONE);

        switch (myServiceBean.getStatus().toString().toLowerCase()) {
            case "completed":
                holder.status.setBackgroundColor(Color.GREEN);
                break;
            case "on progress":
                holder.status.setBackgroundColor(Color.YELLOW);
                break;
            case "canceled":
                holder.status.setBackgroundColor(Color.RED);
                break;
            case "rejected":
                holder.status.setBackgroundColor(Color.RED);
                break;
            case "accept":
                holder.status.setBackgroundColor(Color.BLUE);
                break;
            default:
                holder.status.setBackgroundColor(Color.GRAY);
                break;
        }

        if(myServiceBean.getEst_amount() != null) {
            holder.estimation_region.setVisibility(View.VISIBLE);
            holder.est_status.setText("Estimation is Available");
            holder.btn_approve.setVisibility(View.VISIBLE);

            holder.est_amount.setText("Estimation Amount: " + myServiceBean.getEst_amount());
            if(myServiceBean.getEst_note() != null)
               holder.est_note.setText("Estimation Note: " + myServiceBean.getEst_note());
            if(myServiceBean.getEst_presented_by() != null)
                holder.est_presented_by.setText("Estimation Prepared By: " + myServiceBean.getEst_presented_by());

            if(myServiceBean.getEst_approved_by_customer() == "true"){
                holder.btn_approve.setVisibility(View.GONE);
                holder.est_status.setText("Estimation Approved on : " + myServiceBean.getEst_approved_date());
            }else{
                holder.btn_approve.setVisibility(View.VISIBLE);
            }

        }else{
            holder.estimation_region.setVisibility(View.GONE);
            holder.est_status.setText("Estimation on Process");
            holder.btn_approve.setVisibility(View.GONE);
        }  

        holder.btn_approve.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                updateRequest();
            }
        });




    }

    private void updateRequest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("est_approved_by_customer", true);
            jsonObject.put("est_approved_date", "2017-10-30");
        } catch (JSONException e) {
            e.printStackTrace();
        }

        //progress_dialog.show();
        OkHttpClient client = new OkHttpClient();

        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        okhttp3.RequestBody body = RequestBody.create(JSON, jsonObject.toString());


        okhttp3.Request request = new Request.Builder()
                .url(ApplicationContants.BASE_URL + ApplicationContants.MY_SERVICE_APPROVE_URL)
                .post(body)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    String responseString = response.body().string();

                    JSONObject jsonObject = new JSONObject(responseString);
                    Gson gson = new Gson();
                    final MyServiceBean myServiceBean = gson.fromJson(jsonObject.toString(), MyServiceBean.class);

                    runOnUiThread(new Runnable() {
                        public void run() {

                        }
                    });

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

ear*_*jim 5

runOnUiThread()是一种方法Activity

要么在Activity实例上调用它(如果您有权访问一个实例),要么使用 aHandler将您Runnable的发布到主线程的消息队列:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        // do something
    }
});
Run Code Online (Sandbox Code Playgroud)