热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用append更新TextView并不会打印新文本-updateTextViewusingappenddoesntprintsnewtext

Ihaveanactivity,thatprintsoutalogusingRoboGuice.ThereisaTextViewinit,whichdisplays

I have an activity, that prints out a log using RoboGuice. There is a TextView in it, which displays a large text string read from a file.

我有一个活动,使用RoboGuice打印出日志。其中有一个TextView,它显示从文件中读取的大型文本字符串。

The problem is that I want to add new lines using textView.append() and nothing happens. textView.setText works fine but I can not use that because the text resetting is slow and consumes the CPU.

问题是我想使用textView.append()添加新行,但没有任何反应。 textView.setText工作正常但我不能使用它,因为文本重置很慢并且消耗CPU。

I tried a lot of things. Run it on UI thread, invalidate the view, use the view.post(Runnable) and post it on Handler in UI thread but nothing helps.

我尝试了很多东西。在UI线程上运行它,使视图无效,使用view.post(Runnable)并在UI线程上的Handler上发布但没有任何帮助。

Here is the code sample:

这是代码示例:

public class DiagnosticsActivity extends RoboActionBarActivity implements LogListener {

@Inject
private LogMessageHandler logger;
@InjectView(R.id.logView)
TextView logView;
@InjectView(R.id.logScrollView)
ScrollView scrollView;

public boolean logFileReadFinished = false;
private StringBuilder textUntilReadFinished = new StringBuilder();

private File sdcard;

private class AppendRunnable implements Runnable {
    private String msg;

    private AppendRunnable(String msg) {
        this.msg = msg;
    }

    public void run() {
        logView.append(msg);
        logView.invalidate();
    }
};

@Override
protected void onResume() {
    logger.registerLogListener(this);
    readLogFile();
    scrollView.scrollTo(0, Integer.MAX_VALUE);
    synchronized (this) {
        final String stringUntilReadFinished = textUntilReadFinished.toString();
        textUntilReadFinished = new StringBuilder();
        DiagnosticsActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Handler mHandler = new Handler();
                mHandler.post(new AppendRunnable(stringUntilReadFinished + "\n"));
            }
        });
        logFileReadFinished = true;
    }
    super.onResume();
}

@Override
protected void onPause() {
    logger.removeLogListener();
    logFileReadFinished = false;
    super.onPause();
}

/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.activity_diagnostics);
    ActionBar actiOnBar= getSupportActionBar();
    actionBar.show();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setTitle(R.string.title_diagnostics);
    sdcard = Environment.getExternalStorageDirectory();
}

private void readLogFile() {
    FileInputStream fileInputStream = null;
    BufferedReader reader = null;
    try {
        final StringBuilder text = new StringBuilder();
        File file = new File(sdcard, LoggerImpl.logName + ".log");
        if (file.exists()) {
            try {
                fileInputStream = new FileInputStream(file);
                reader = new BufferedReader(new InputStreamReader(fileInputStream));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    text.append(line + "\n");
                }
                DiagnosticsActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        logView.setText(text);
                    }
                });
            } catch (FileNotFoundException e) {
                logger.error("Log file not found!", e);
            } catch (IOException e) {
                logger.error("Cannot read log file!", e);
            }
        }
    } finally {
        try {
            reader.close();
            fileInputStream.close();
        } catch (IOException e) {
            logger.error("Cannot close log file", e);
        }
    }
}

@Override
public void onLogEvent(final String msg, Throwable throwable) {
    synchronized (this) {
        if (logFileReadFinished) {
            DiagnosticsActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Handler mHandler = new Handler();
                    mHandler.post(new AppendRunnable(msg + "\n"));
                }
            });
        } else {
            textUntilReadFinished.append(msg + "\n");
        }
    }
}

1 个解决方案

#1


Have you checked to make sure that msg is not empty when you call append()?

您是否检查过以确保在调用append()时msg不为空?

As an alternative you can update your TextView without deleting the old information by using the following:

作为替代方法,您可以使用以下内容更新TextView而不删除旧信息:

logView.setText(logView.getText() + msg);

The above snippet will get the currently displayed text, append your new message, and then display the entire String.

上面的代码段将获取当前显示的文本,附加新消息,然后显示整个String。


推荐阅读
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文实例讲述了Android编程实现读取工程中的txt文件功能。分享给大家供大家参考,具体如下:1.众所周知,Android的res文件夹 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 国庆节到了,安利一个Android的自动动态授权插件
    Android的老铁都知道申请权限时,除了要在AndroidManifest添加权限,还需要在activity中通过requestpermission对 ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
author-avatar
陈玲琳2013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有