- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
06-13 17:29:30.750: W/dalvikvm(6257): threadid=13: thread exiting with uncaught exception (group=0xb1af0ba8)
06-13 17:29:30.780: E/AndroidRuntime(6257): FATAL EXCEPTION: Thread-251
06-13 17:29:30.780: E/AndroidRuntime(6257): Process: me.l0lkj.birthdaytimer, PID: 6257
06-13 17:29:30.780: E/AndroidRuntime(6257): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:857)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.view.View.invalidate(View.java:10935)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.view.View.invalidate(View.java:10890)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.widget.TextView.updateAfterEdit(TextView.java:7430)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.widget.TextView.handleTextChanged(TextView.java:7453)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9183)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:253)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.widget.TextView.append(TextView.java:3409)
06-13 17:29:30.780: E/AndroidRuntime(6257): at android.widget.TextView.append(TextView.java:3396)
06-13 17:29:30.780: E/AndroidRuntime(6257): at me.l0lkj.birthdaytimer.Screen2.appendTextAndScroll(Screen2.java:180)
06-13 17:29:30.780: E/AndroidRuntime(6257): at me.l0lkj.birthdaytimer.Screen2.access$1(Screen2.java:177)
06-13 17:29:30.780: E/AndroidRuntime(6257): at me.l0lkj.birthdaytimer.Screen2$ListenFromServer.run(Screen2.java:273)
06-13 17:29:58.330: I/Process(6257): Sending signal. PID: 6257 SIG: 9
06-13 17:33:57.960: D/dalvikvm(6315): GC_FOR_ALLOC freed 57K, 9% free 3567K/3920K, paused 137ms, total 138ms
06-13 17:33:58.590: D/(6315): HostConnection::get() New Host Connection established 0xb91170e0, tid 6315
06-13 17:34:10.310: E/Første skjerm(6315): 10.0.0.59.1500.Anonym.123123
06-13 17:34:11.460: D/dalvikvm(6315): GC_FOR_ALLOC freed 19K, 8% free 3894K/4200K, paused 23ms, total 26ms
06-13 17:34:11.480: I/dalvikvm-heap(6315): Grow heap (frag case) to 6.498MB for 2536936-byte allocation
06-13 17:34:11.510: D/dalvikvm(6315): GC_FOR_ALLOC freed 1K, 5% free 6370K/6680K, paused 31ms, total 31ms
06-13 17:34:11.690: E/Andre skjerm(6315): 10.0.0.59.1500.Anonym.123123
我刚开始编码,目前正在开发我的 Android 聊天客户端,但遇到了这个问题:
ViewRootImpl$CalledFromWrongThreadException:只有创建 View 层次结构的原始线程才能触及它的 View 。
我四处搜索,但似乎无法找到解决此问题的任何方法。短期内我想要什么:
很好地解释了这个问题是什么以及如何解决它。为什么会发生等
更正我的代码或帮我找到解决方案。我阅读了关于哪些类可以访问和不可以访问的内容,但我没有找到好的解决方案。
我的代码有点困惑,对此深表歉意(我还是菜鸟,请记住:))
package me.l0lkj.birthdaytimer;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import me.l0lkj.birthdaytimer.userlisthandler.UserInfo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Layout;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
public class Screen2 extends Activity {
ArrayList<UserInfo> lastPlayerRegrex = new ArrayList<UserInfo>();
boolean running = false;
ScrollView chat_ScrollView;
TextView chat_text_chat;
TextView editText1;
String server;
int port;
String brukernavn;
String passord;
private ObjectInputStream sInput;
private ObjectOutputStream sOutput;
private Socket socket;
@Override
public void onCreate(Bundle savedInstanceState) {
running = true;
super.onCreate(savedInstanceState);
setContentView(R.layout.screen2);
Button btnSend = (Button) findViewById(R.id.btnSend);
btnSend.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
sendLine();
}
});
Button btnClose = (Button) findViewById(R.id.btnClose);
btnClose.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
appendTextAndScroll("Forlater nå chatten!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
running = false;
disconnect();
}
});
Button btnList = (Button) findViewById(R.id.btnList);
btnList.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//String test = "NAME:l0lkj;IP:10.0.0.39;SINCE:123422,NAME:asdasd;IP:10.0.0.234;SINCE:345678,NAME:ihkjhg;IP:10.04.6.7;SINCE:078273549234";
sendMessage(new Message(Message.LIST_USERS, ""));
//ArrayList<UserInfo> users = Format(test);
/*
* Denne metoden skal sende inn en Message med syntaksen:
*
* new Message(4, "");
*
*
*
*/
/*
for(UserInfo user : users){
long millis = user.getTid();
int seconds = (int) (millis / 1000) % 60 ;
int minutes = (int) ((millis / (1000*60)) % 60);
int hours = (int) ((millis / (1000*60*60)) % 24);
String userdata = user.getName() + " IP:" + user.getIp() + " \n Tid online: " + hours + " timer, " + minutes + " minutter og " + seconds + " sekunder.";
appendTextAndScroll(userdata);
}*/
}
});
editText1 = (TextView) this.findViewById(R.id.editText1);
editText1.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_SEND) {
sendLine();
handled = true;
}
return handled;
}
});
chat_text_chat = (TextView) this.findViewById(R.id.chat_text_chat);
chat_text_chat.setMovementMethod(new ScrollingMovementMethod());
Intent i = getIntent();
server = i.getStringExtra("server");
port = Integer.parseInt(i.getStringExtra("port"));
brukernavn = i.getStringExtra("brukernavn");
passord = i.getStringExtra("passord");
Log.e("Andre skjerm", server + "." + port + "." + brukernavn + "." + passord);
appendTextAndScroll("");
this.start();
}
private void disconnect() {
try {
if(sInput != null) sInput.close();
}
catch(Exception e) {}
try {
if(sOutput != null) sOutput.close();
}
catch(Exception e) {}
try{
if(socket != null) socket.close();
}
catch(Exception e) {}
finish();
}
@SuppressWarnings("unused")
private void startConnection(String address, int port){
}
private void broadcastText(String text){
//appendTextAndScroll(text);
this.sendMessage(new Message(Message.MELDING, text));
//sende til serveren
}
private void sendMessage(Message msg){
try {
sOutput.writeObject(msg);
}
catch(IOException e) {
appendTextAndScroll("Exception writing to server: " + e);
}
}
private void appendTextAndScroll(String text) {
if(text.length() >= 1){
if(chat_text_chat != null){
chat_text_chat.append(text + "\n");
final Layout layout = chat_text_chat.getLayout();
if(layout != null){
int scrollDelta = layout.getLineBottom(chat_text_chat.getLineCount() - 1) - chat_text_chat.getScrollY() - chat_text_chat.getHeight();
if(scrollDelta > 0){
chat_text_chat.scrollBy(0, scrollDelta);
}
}
}
}
}
private void sendLine(){
String text = editText1.getText().toString();
editText1.setText("");
broadcastText(text);
}
public ArrayList<UserInfo> Format(String rawFromServer){
ArrayList<UserInfo> userObjects = new ArrayList<UserInfo>();
String[] users = rawFromServer.split(",");
for(String user : users){
String name = null;
String ip = null;
long since = 0;
String[] keys = user.split(";");
for(String key : keys){
String[] keyAndAns = key.split(":");
if(keyAndAns[0].equals("NAME")){
name = keyAndAns[1];
}
if(keyAndAns[0].equals("IP")){
ip = keyAndAns[1];
}
if(keyAndAns[0].equals("SINCE")){
since = Long.parseLong(keyAndAns[1]);
}
}
userObjects.add(new UserInfo(name, ip, since));
}
return userObjects;
}
public boolean start() {
try {
socket = new Socket(server, port);
}
catch(Exception ec) {
appendTextAndScroll("Feil under oppkobling til serveren:" + ec);
return false;
}
String msg = "Kobling godtatt fra " + socket.getInetAddress() + ":" + socket.getPort();
appendTextAndScroll(msg);
try
{
sInput = new ObjectInputStream(socket.getInputStream());
sOutput = new ObjectOutputStream(socket.getOutputStream());
}
catch (IOException eIO) {
appendTextAndScroll("Unntak ved ny Input/output strøm: " + eIO);
return false;
}
new ListenFromServer().start();
try {
sOutput.writeObject((brukernavn + ":" + passord));
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
class ListenFromServer extends Thread {
public void run() {
while(true) {
try {
String msg = (String) sInput.readObject();
appendTextAndScroll(msg);
}
catch(IOException e) {
appendTextAndScroll("Serveren har stengt koblingen: " + e);
break;
}
catch(ClassNotFoundException e2) {}
}
}
}
}
谢谢您的回答;
问候亚历山大
最佳答案
您收到一个 CalledFromWrongThreadException
错误,因为您正在尝试从后台线程更新 View 。这是不允许的。
在这种情况下,最简单的更改可能是修改 appendTextAndScroll()
本身以确保它在 UI 线程中运行。
private void appendTextAndScroll(String text)
{
runOnUiThread(new Runnable()
{
public void run()
{
if(text.length() >= 1){
if(chat_text_chat != null){
chat_text_chat.append(text + "\n");
final Layout layout = chat_text_chat.getLayout();
if(layout != null){
int scrollDelta = layout.getLineBottom(chat_text_chat.getLineCount() - 1) - chat_text_chat.getScrollY() - chat_text_chat.getHeight();
if(scrollDelta > 0){
chat_text_chat.scrollBy(0, scrollDelta);
}
}
}
}
}
});
}
关于java - Android 编码 : ViewRootImpl$CalledFromWrongThreadException. [菜鸟],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214291/
我已经看到很多关于这个主题的问题,但我对任何答案都不满意。 我希望它有一个 class ConnectionController implements Runnable 负责打开到服务器的连接,读取和
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon
当我按下按钮时,我不断收到 CalledFromWringThreadException。 我的程序是这样的: public class MainActivity extends Activity i
我正在创建一款使用 Sphero 机器人球的游戏。当游戏开始/恢复时,它会检查配对或连接的球。如果蓝牙关闭,或者没有配对球,它会隐藏连接窗口。如果有配对但未连接的球,则转到此功能。 // If the
我们从 Crashlytics 收到错误报告,影响了相当一部分用户(大约 10%)。这是一个 CalledFromWrongThreadException。 问题是我不知道是什么导致了这个问题,我自己
我有一个 Activity 启动然后创建一个新的 NetworkHandler 实例,在 NetworkHandler 中我在一个新线程上运行它,这样 UI 线程就不会被卡住。 NetworkHand
我在 ListView 中显示了网页下载百分比的进度条。 for(int i=0;i { int id; public UploadTask(int id) {
我有一个 IntentService 可以像这样更新偏好: SharedPreferences.Editor editor = userPrefs.edit(); editor.putInt("COU
我正在尝试使用 Kotlin 协程在后台运行一些繁重的工作。 但是我收到了这个错误信息, 'android.view.ViewRootImpl$CalledFromWrongThreadExcepti
我有一种感觉是我的计时器导致了这次崩溃。奇怪的是我似乎无法在模拟器中重现它,但我的 Play 控制台崩溃报告告诉我用户不断遇到此崩溃: android.view.ViewRootImpl$Called
我使用的是 this , 显示来自互联网的图像,但它会引发如下错误: 04-12 13:45:05.337: E/AndroidRuntime(27897): Caused by: android.v
我的 logcat 中出现错误,指出: java.net.UnknownHostException: apps.example.com 09-13 14:57:28.970: W/System.err
我是 Android 初学者,所以如果这是一个愚蠢的问题,请友善。 我正在尝试动态更新四个 TextView。每当我尝试更新它们时,程序就会崩溃。 我不明白“只有创建 View 层次结构的原始线程才能
我在编写的应用程序中遇到一个非常奇怪的问题。这可能很简单,我对服务、AsyncTasks 以及何时可以再次访问 UI 线程有一些误解。 该应用程序包含一个主要 Activity ,您可以通过该 Act
我正在按照 android 教程构建天气应用程序,但是当我尝试将 mTemperature TextView 设置为我从预测 API 获得的温度时,我收到此错误“android.view.ViewRo
我在做 Espresso 测试时出错 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original threa
我已经创建了一个可以从 Activity 中的任何地方访问的 Handler,并且还编写了一个方法来更轻松地调用处理程序: private Handler textFromBGThread = new
我正在为一个 Android 应用开发一个测试类,我收到了一个 android.view.ViewRootImpl$CalledFromWrongThreadException。该代码假设模拟输入到文
我正在使用 OpenCV 库实现一个应用程序。处理完相机的 inputFrame 后,我想更新我的 TextView。但是,我收到以下错误: 08-01 17:01:45.085: E/Android
我不确定我的低估是否正确,因为我没有得到预期的输出。我有一个类,我在其中调用一个应该启动线程的方法。 public class MainActivity extends Activity { prot
我是一名优秀的程序员,十分优秀!