【问题标题】:A long text in the TextViewTextView 中的长文本
【发布时间】:2013-06-24 14:25:21
【问题描述】:

我有一个按钮,当我点击它时,我将textView.setText() 变成一个非常大的文字,50000 个符号,并且界面停止了 3 秒,我该如何解决?

  1. 我尝试使用 Handle 和 thread 制作它,但没有帮助。
  2. 我尝试制作textview.append(),但也没有用。

                MainActivity.this.runOnUiThread(new Runnable() {
    
                @Override
                public void run() {
    
                    textText.append(rowItemHeader.getText().substring((endOfNews - 10000, endOfNews));
                }
            });
    

    编辑 1 无结果

private class MyTask extends AsyncTask <Void, Void, String> { String str; TextView txt;

    MyTask(String str, TextView txt){
        this.str = str;
        this.txt = txt;

    }
    public String doInBackground(Void... args) {

        return str.substring(endOfNews - 10000, endOfNews);
    }

    public void onPostExecute(String myString) {
        // do your update here or you will get that error (the original thread one)
        txt.append(myString);
    }
}

【问题讨论】:

  • 什么不起作用?变量myString 是否正确阐述?
  • 它的工作,但我有 1-3 秒的延迟,当我点击按钮。如果我有小文本,它会很快运行,但如果我有非常大的文本,我会延迟。
  • 好的,但是你用 AsyncTask 解决了这个问题吗?
  • 不,一切都是一样的,我附加了 10000 个符号,我认为 setText() 和 append() 处理大文本的速度很慢。所以,我不能在后台做,我需要在 Ui 线程上做:(

标签: android textview longtext


【解决方案1】:

你是如何声明线程的? 你必须使用类似的东西:

this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Log.e("TAG synchronize", "synchronize");
        }
});

【讨论】:

  • 我确实喜欢这样,但它也会停止界面 1-3 秒 :(
【解决方案2】:

使用AsyncTask,它们正是您想要的。它们是辅助线程,易于设置并从主线程执行。

在线程内使用循环,将生成的文本的appends 部分使用runOnUiThread(new Runnable(...)...) 并调用Thread.sleep(50),这会强制线程休眠那么多毫秒以防止延迟。

【讨论】:

  • 如果我使用 AsyncTask 我有错误“只有创建视图层次结构的原始线程才能触及它的视图。”
  • 那你没有完全做到,你没有做到runOnUiThread() 让它“在ui线程上运行”!只有 appending 应该“在 ui 线程上运行”不要将整个 AsyncTask 操作放在 ui 上运行,因为这也会使其冻结。
【解决方案3】:

将 AyncTask 与以下内容一起使用:

private class MyTask extends AsyncTask<Void, Void, String> {

    private Context context;       

    public MyTask(Context context) {
        this.context = context;
    }

    public String doInBackground(Void... args) {
        // do your job here
        return myString;
    }

    public void onPostExecute(String myString) {
        // do your update here or you will get that error (the original thread one)
        ((TextView)context.findViewById(R.id.textview)).setText(myString);
    }
}

然后在你的活动中

new MyTask(MyActivity.this).execute();

【讨论】:

    【解决方案4】:

    首先,删除视图,然后在后台线程上添加文本,然后再添加视图。如果您需要一些示例代码,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多