android - 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)
解决方案
看起来您正在尝试启动一个已经启动的线程。
您尚未发布所有代码,但很明显您的线程已在其他地方初始化并由 mySendTramaThread 引用。
因此,当您的 onClick 第一次触发时,您的线程就会启动。第二次 onClick 触发时,您尝试再次启动它。
这就是导致 IllegalThreadStateException 的原因。
您可以在调用 start 之前检查您的线程是否首先启动isAlive()
。
推荐阅读
- azure-devops - Azure DevOps 2019 中的自定义发布 def context 命令中断
- sql - MS Access - 查询表达式中缺少运算符
- python - numpy - 与 array.sum 相反(减法?)
- docker - 如何将文件挂载到 Jenkins docker
- javascript - SetInterval() 函数未正确更新页面元素
- dialogflow-es - MediaResponse 无法播放音频
- node.js - 使用 NodeJS SDK 引发错误时,如何在 Application Insights 中设置异常类型?
- reactjs - 如何在点击时对“切换”数据进行排序?
- r - 跨 data.frame 中的列迭代函数
- html - 无法让弹性框垂直和水平居中项目