gpt4 book ai didi

android - 使用 Handler 从线程更新 UI 时出错

转载 作者:行者123 更新时间:2023-11-29 18:16:53 24 4
gpt4 key购买 nike

我试图在一个单独的线程中将数据发送到服务器,并让它将消息发送回我在主线程中的处理程序以更新 UI。

我让它为它发送的前 2 条消息工作,但由于某种原因我收到 CalledFromWrongThreadException。

我在下面的代码中添加了注释,以显示有效的方法以及失败的地方。

如有任何帮助,我们将不胜感激。

    //Started in onCreate()
Thread thread = new Thread(new Runnable(){
public void run() {
sendFiles();
}
});

thread.start();

private void sendFiles(){

if(new File(filePath+"/description.txt").isFile()){ //The messages sent from in this if() work but the others bomb.
Message message = progressTextHandler.obtainMessage();
message.obj = (progressText.getText() + "\n Started Sending description.txt\n");
progressTextHandler.sendMessage(message);

if(sendToServer(filePath+"/description.txt")){
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Finished Sending description.txt\n");
progressTextHandler.sendMessage(message1);
}else{
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Error Sending description.txt\n");
progressTextHandler.sendMessage(message1);
}
}

for(int x = 0; x<getIntent().getExtras().getInt("numOfAudio"); x++ ){
Message message = progressTextHandler.obtainMessage();
message.obj = (progressText.getText() + "\n Started Sending " + getIntent().getExtras().getString("audio"+String.valueOf(x)) + "\n");
progressTextHandler.sendMessage(message);

if(sendToServer(getIntent().getExtras().getString("audio"+String.valueOf(x)))){
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Finished Sending " + getIntent().getExtras().getString("audio"+String.valueOf(x)) + "\n");
progressTextHandler.sendMessage(message1);
}else{
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Error Sending " + getIntent().getExtras().getString("audio"+String.valueOf(x)) + "\n");
progressTextHandler.sendMessage(message1);
}

}

for(int k = 0; k<getIntent().getExtras().getInt("numOfBrowsed"); k++){
Message message = progressTextHandler.obtainMessage();
message.obj = (progressText.getText() + "\n Started Sending " + getIntent().getExtras().getString("pic"+String.valueOf(k))+"\n");
progressTextHandler.sendMessage(message);

if(sendToServer(getIntent().getExtras().getString("pic"+String.valueOf(k)))){
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Finished Sending " + getIntent().getExtras().getString("pic"+String.valueOf(k))+"\n");
progressTextHandler.sendMessage(message1);
}else{
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Error Sending " + getIntent().getExtras().getString("pic"+String.valueOf(k))+"\n");
progressTextHandler.sendMessage(message1);
}

}
for(int l = 0; l<getIntent().getExtras().getInt("numOfStills"); l++){
Message message = progressTextHandler.obtainMessage();
message.obj = ("\n Started Sending " + getIntent().getExtras().getString("still"+String.valueOf(l))+"\n");
progressTextHandler.dispatchMessage(message);

if(sendToServer(getIntent().getExtras().getString("still"+String.valueOf(l)))){
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Finished Sending " + getIntent().getExtras().getString("still"+String.valueOf(l))+"\n");
progressTextHandler.dispatchMessage(message1);
}else{
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Error Sending " + getIntent().getExtras().getString("still"+String.valueOf(l))+"\n");
progressTextHandler.dispatchMessage(message1);
}

}

for(int m = 0; m<getIntent().getExtras().getInt("numOfVideos"); m++){
Message message = progressTextHandler.obtainMessage();
message.obj = (progressText.getText() + "\n Finished Sending " + getIntent().getExtras().getString("video"+String.valueOf(m))+"\n");
progressTextHandler.dispatchMessage(message);

if(sendToServer(getIntent().getExtras().getString("video"+m))){
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Finished Sending " + getIntent().getExtras().getString("video"+String.valueOf(m))+"\n");
progressTextHandler.dispatchMessage(message1);
}else{
Message message1 = progressTextHandler.obtainMessage();
message1.obj = (progressText.getText() + "\n Error Sending " + getIntent().getExtras().getString("video"+String.valueOf(m))+"\n");
progressTextHandler.dispatchMessage(message1);
}
}

}// end of sendFiles()



progressTextHandler = new Handler(){ //my handler that also lives in onCreate()
public void handleMessage(Message msg){
progressText.setText((String)msg.obj);
}
};

这是我得到的 printStackTrace。

10-03 23:51:20.105: WARN/dalvikvm(5760): threadid=10: thread exiting with uncaught exception (group=0x40018560)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): FATAL EXCEPTION: Thread-11
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.view.View.invalidate(View.java:5255)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.TextView.invalidateCursor(TextView.java:3983)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.TextView.spanChange(TextView.java:6797)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:6926)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:632)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:535)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.text.Selection.setSelection(Selection.java:74)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.text.Selection.setSelection(Selection.java:85)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:268)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.TextView.setText(TextView.java:3003)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.TextView.setText(TextView.java:2883)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.EditText.setText(EditText.java:78)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.widget.TextView.setText(TextView.java:2858)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at com.vincentjuliano.jreporter.SubmitServer$2.handleMessage(SubmitServer.java:104)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at android.os.Handler.dispatchMessage(Handler.java:99)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at com.vincentjuliano.jreporter.SubmitServer.sendFiles(SubmitServer.java:227)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at com.vincentjuliano.jreporter.SubmitServer.access$4(SubmitServer.java:173)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at com.vincentjuliano.jreporter.SubmitServer$1$1.run(SubmitServer.java:70)
10-03 23:51:20.144: ERROR/AndroidRuntime(5760): at java.lang.Thread.run(Thread.java:1019)
10-03 23:51:20.167: WARN/ActivityManager(1322): Force finishing activity com.vincentjuliano.jreporter/.SubmitServer

最佳答案

我觉得有点晚了,但我会告诉你我的意见:问题是你在几行中使用了 handler.dispatchMessage(而你在前几行中使用了 handler.sendMessage,这是正确的)。

虽然 dispatchMessage 在调用 dispatchMessage 方法的同一线程中立即调用处理程序,但使用 sendMessage 时,消息将在 handleMessage(Message) 中接收,在附加到此处理程序的线程中。。

因此,如果您将那些 dispatchMessage 替换为 sendMessage,它就可以正常工作,并且代码将比使用 runOnUiThread 更简洁。

我希望这对某人有用:)

关于android - 使用 Handler 从线程更新 UI 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7643181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com