2013-06-24 4 views
1

У меня есть кнопка, и когда я нажимаю на нее, я делаю textView.setText() очень большой текст, 50000 символов, и интерфейс останавливается на 3 секунды, как я могу это исправить?Длинный текст в TextView

  1. Я попытался сделать это с помощью ручки и нитки, но это не помогло.
  2. Я попытался сделать textview.append(), но он также не помог.

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

    Edit 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); 
    } 
} 
+0

Что не работает? Правильно ли определена переменная 'myString'? – Enrichman

+0

его работа, но у меня есть задержка на 1-3 секунды, когда я нажимаю кнопку. Если у меня есть небольшой текст, он работает быстро, но если у меня очень текстовый текст, у меня есть задержка. –

+0

Хорошо, но вы исправили это с помощью AsyncTask? – Enrichman

ответ

0

Как вы объявляете нить? Yu've использовать что-то вроде этого:

this.runOnUiThread(new Runnable() { 

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

Мне это понравилось, но он также останавливает интерфейс в течение 1-3 секунд :( –

0

Использование AsyncTask, они предназначены именно то, что вы хотите. Это вторичный поток, который легко настраивается и выполняется из основного потока.

Используйте петлю внутри нити, что appends части генерируемого текст на TextView с помощью runOnUiThread(new Runnable(...)...) и называют Thread.sleep(50), которая заставляет Нить спать на том, что много миллисекунд, чтобы предотвратить отставание.

+0

Если у меня с AsyncTask у меня ошибка «Только оригинал поток, создавший иерархию представлений, может коснуться его представлений ». –

+0

Тогда вы не сделали этого полностью, вы не выполнили' runOnUiThread() ', который заставляет его« запускаться в потоке ui »! Только' appending' должно быть «run on the ui thread» не помещает все операции 'AsyncTask' на работу с ui, так как это заставило бы замораживаться. – LuckyMe

0

Используйте 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(); 
+0

Нет результата, я отредактировал свой вопрос :( –

0

Во-первых, удалить представление, затем добавить текст на фоновом потоке, а затем добавить вид сзади. Скажите мне, если вам нужен образец кода.

+0

hmmm, interesting, можете ли вы дать некоторые образец кода –