无法调用runOnUiThread()

时间:2017-04-03 11:06:58

标签: android okhttp3 android-viewholder

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

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

实际问题是runOnUiThread()无法接受onBindViewHolder()

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

    }
});

如何在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();
                }
            }
        });
    }

2 个答案:

答案 0 :(得分:3)

runOnUiThread()Activity的方法。

Activity实例上调用它(如果您有权访问),或者使用HandlerRunnable发布到主线程的消息队列中:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        // do something
    }
});

答案 1 :(得分:0)

您应该在调用runOnUiThread之前开始活动:

getActivity.runOnUiThread(new Runnable(){
            @Override
            public void run(){
                 /*your code*/
            }
});