首页 > 解决方案 > Android Studio中onClick内部的线程

问题描述

在Android Studio中,单击按钮时我需要向外部发送几帧,为此我必须每200毫秒发送一帧我正在使用线程,第一次单击按钮时一切运行正常,但是在按下按钮后第二次应用程序崩溃,这是我做错了什么?

这里mi代码:

public class TerminalFragment extends Fragment implements ServiceConnection, SerialListener {
.
.
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_terminal, container, false);
.
.
myBotonSend = view.findViewById(R.id.bt_SendButton);
.
.
myBotonSend.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
     mySendTramaThread.start();
    }
  });

  return view;
}

这是我的主题:

Thread mySendTramaThread = new Thread(new Runnable() {
    @Override
    public void run() {
        counterReintentos =5;
        flagReceiver =false;
        stringvalorOfNroTrama =Integer.toString(nroTrama +1);
        while((!flagReceiver)  && (counterReintentos != 0) ){
            try {
                bufferSendTrama = "{\"f\":\"" + stringvalorOfNroTrama + "\"}";
                Log.e("DEBUGTX-->", bufferSendTrama);
                send(bufferSendTrama.toString());
                counterReintentos--;
                Log.e("DEBUG-->", "CounterReintentos = " + counterReintentos);
                Thread.sleep(2000); //Delay
            } catch (InterruptedException e) {
                Log.e("DEBUG_ERROR", "exception", e);
            }
        }

        for (int i = 0; i < nroTrama; i++) {
            try {
                Thread.sleep(200); //Delay
                bufferSendTrama = myBuffer.substring((20 * i), (i * 20 + 20));
                Log.e("DEBUGTX-->", bufferSendTrama);
                send(bufferSendTrama.toString());
            } catch (InterruptedException e) {
                Log.e("DEBUG_ERROR", "exception", e);
            }
        }
    }
});

这里是日志错误

    --------- beginning of crash
2021-06-24 20:21:58.103 4803-4803/com.wsr.blespotx E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wsr.blespotx, PID: 4803
java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:868)
    at com.wsr.blespotx.TerminalFragment$4.onClick(TerminalFragment.java:275)     HERE THE ERRO
    at android.view.View.performClick(View.java:7870)
    at android.widget.TextView.performClick(TextView.java:14970)
    at android.view.View.performClickInternal(View.java:7839)
    at android.view.View.access$3600(View.java:886)
    at android.view.View$PerformClick.run(View.java:29363)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:7948)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)

标签: androidmultithreading

解决方案


看起来您正在尝试启动一个已经启动的线程。

您尚未发布所有代码,但很明显您的线程已在其他地方初始化并由 mySendTramaThread 引用。

因此,当您的 onClick 第一次触发时,您的线程就会启动。第二次 onClick 触发时,您尝试再次启动它。

这就是导致 IllegalThreadStateException 的原因。

您可以在调用 start 之前检查您的线程是否首先启动isAlive()


推荐阅读