Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
351 views
in Technique[技术] by (71.8m points)

android已经将UI操作放入主线程,仍然报错

在activity里就没问题,到了自定义class里就不行了 ,弹框之后,点 取消按钮 就报错:Only the original thread that created a view hierarchy can touch its views.

image.png

package com.juhui.zc;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.juhui.zc.util.DebugLogUtil;
import com.juhui.zc.util.UiThread;
import com.meihua.passivelock.fastble.BleManager;
import com.meihua.passivelock.fastble.data.BleDevice;

import java.util.List;

/**
 * Created On 2018/7/23.
 */
public class BluetoothListDialog implements View.OnClickListener {

    private Dialog dialog;
    private Activity activity;
    private List<BleDevice> scanResultList;
    private BluetoothListAdapter adapter;
    private ListView listDevice;
    private TextView tvNoData;
    private TextView tvTitle;
    private TextView tvDisConnect;
    private View viewDisConnect;
    private TextView tvDismiss;
    private BLEClickListener listener;

    public BleDevice bleDevice;
//    private Handler lockUiHandler;// 用于操作UI 的
//    private UiThread lockThread;

    public void setBleDevice(final BleDevice bleDevice) {
        this.bleDevice = bleDevice;
//        tvTitle.setText("已搜索到的设备");

        if (bleDevice == null) {
            tvDisConnect.setVisibility(View.GONE);
            viewDisConnect.setVisibility(View.GONE);
        } else {
            tvDisConnect.setVisibility(View.VISIBLE);
            viewDisConnect.setVisibility(View.VISIBLE);
        }


    }


    public void setList(List<BleDevice> scanResultList1) {
        this.scanResultList = scanResultList1;

        if (adapter == null) {
            adapter = new BluetoothListAdapter(activity);

        }
        adapter.setListData(scanResultList);
        listDevice.setAdapter(adapter);
        adapter.notifyDataSetChanged();


    }

    public interface BLEClickListener {

        public void setOnItemClickListener(BleDevice bleDevice);

    }

    public BluetoothListDialog(Activity activity, BLEClickListener listener1) {
        this.listener = listener1;
        this.activity = activity;
        dialog = new Dialog(activity);
        dialog.setCanceledOnTouchOutside(false);
        View contentView = LayoutInflater.from(activity).inflate(R.layout.act_bluetooth_list_dialog, null);
        dialog.setContentView(contentView);

        Window window = dialog.getWindow();
        assert window != null;
        window.setBackgroundDrawableResource(android.R.color.transparent);

        LinearLayout linBackground = window.findViewById(R.id.linBackground);
        WindowManager manager = activity.getWindow().getWindowManager();
        DisplayMetrics outMetrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(outMetrics);
        int width = outMetrics.widthPixels;
        ViewGroup.LayoutParams lp = linBackground.getLayoutParams();
        lp.width = (int) (width * 0.6);
        linBackground.setLayoutParams(lp);

        listDevice = window.findViewById(R.id.listDevice);
        tvNoData = window.findViewById(R.id.tvNoData);
        tvTitle = window.findViewById(R.id.tvTitle);
        tvDisConnect = window.findViewById(R.id.tvDisConnect);
        viewDisConnect = window.findViewById(R.id.viewDisConnect);
        tvDismiss = window.findViewById(R.id.tvDismiss);
        tvDismiss.setOnClickListener(this);
        tvDisConnect.setOnClickListener(this);


        listDevice.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                BleDevice bleDevice = scanResultList.get(i);
                listener.setOnItemClickListener(bleDevice);
            }
        });
//        initThread();
    }




    public void show() {
        if (dialog != null) {
            dialog.show();
        }
    }

    public void dismiss() {
        DebugLogUtil.getInstance().Debug((Looper.getMainLooper().getThread() == Thread.currentThread()) + "");
        if (dialog != null && dialog.isShowing()) {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    dialog.dismiss();
                }
            });
        }
    }

    @Override
    public void onClick(View view) {
        final int i = view.getId();
        if (i == R.id.tvDismiss) {
            dismiss();
        } else if (i == R.id.tvDisConnect) {
            if (bleDevice != null) {
                BleManager.getInstance().disconnect(bleDevice);
            }
            dismiss();
        }


//        lockThread = new UiThread() {
//            @Override
//            public void run() {
//                super.run();
//                Message a = new Message();
//                Bundle bundle = new Bundle();
//                bundle.putInt("view", i);
//                a.setData(bundle);
//                a.what = 99;
////                lockUiHandler.sendEmptyMessage(i);
//                lockUiHandler.sendMessage(a);
//            }
//        };
//        lockThread.start();
    }

}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

创建与引用时必须在同一线程,这个地方可能要调整

public BluetoothListDialog(Activity activity, BLEClickListener listener1) {
  ...
  dialog = new Dialog(activity);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...