2013-06-11 4 views
0

Привет, У меня есть приложение для Android, которое в основном имеет EditText, чтобы получить userinput, TextView для вывода обработанных данных и кнопки, чтобы все исправить. После того, как пользователь нажмет кнопку и будет создан новый поток, и будут выполняться следующие две петли и каждый раз добавление нового вывода в TextView. Однако, какая проблема, вывод TextView не будет в TextView в реальном времени, когда петли закончены, отображает все выведенные данные одновременно, пожалуйста, помогите.Выход TextView в реальном времени

package com.example.assignment2_android; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Calendar; 
import java.util.LinkedList; 
import java.util.Queue; 
import java.util.Random; 

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class station extends Activity 
{ 
    Button run, clear, home; 
    EditText userinput; 
    TextView useroutput; 

    //LinkedList Customer Queue created here. 
    public static Queue<String> line = new LinkedList<String>(); 
    private static String time; //time variable. 
    private static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); //DateFormat variable. 

    private int intervals; 
    private int cashiers; 
    private int processing_time; 
    Thread arrival; 
    Handler handler, handlerr, handlerrr; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.station); 

     userinput = (EditText)findViewById(R.id.s_userinput); 
     useroutput = (TextView)findViewById(R.id.s_useroutput); 

     clear = (Button)findViewById(R.id.button_clear); 
     clear.setOnClickListener(new View.OnClickListener() 
     { 
       public void onClick(View view) 
       { 
        line.clear(); 
        userinput.setText("Line Cleared"); 
        useroutput.setText(""); 
        System.out.println("cleared"); 
       } 
     }); 

     home = (Button)findViewById(R.id.button_home); 
     home.setOnClickListener(new View.OnClickListener() 
     { 
       public void onClick(View view) 
       { 
        Intent a = new Intent(station.this, MainActivity.class); 
        startActivity(a); 
       } 
     }); 
    } 

    public void startProgress(View view) 
    { 
     handler = new Handler(); 
     Thread arrival = new Thread(); 
     { 
      useroutput.append("CUSTOMERS ARE COMING !!!! !!!!" + "\n" + "\n");; 
      //Array of all the customer that will enter the queue. 
      String list[] = {"Naqi", "Monty", "Mohin", "Yasmin", "Maighjoo", "Ashish", "Paal", "Kevin", "Ruhail", "Tony"}; 
      //2nd ArrayList which customer are added to and removed later on so no duplicates arise. 
      ArrayList<String> customer = new ArrayList<String>(Arrays.asList(list)); 

      int array_customer_list = list.length; //Recording the number of customers in the array. 

      //While statement containing for loop add customers to the empty LinkedList object. 
      while (line.isEmpty()) 
      { 
       for (int x = 0; x < array_customer_list; x++) 
       { 
        try 
        { 
         Thread.sleep(ran_interval() * 1000); //Sleep method to hold the arrival time by 1-2 seconds. 
         int cus = (int) (Math.random() * customer.size()); //Random customer is picked here. 
         String new_cus = customer.get(cus); //New customer object is created ere. 
         line.add(new_cus); //Customer objects are added to the empty LinkedList queue. 
         customer.remove(cus); 

         //For loop statement to outputting the queue. 
         for (String s : line) 
         { 
          useroutput.append("[" + s.toString() + " " + "]" + "\n");; //Outputting each customer and using the ".name" method so customers are readable. 
         } 
         //Outputting the whole queue and stating who has joined the queue. 
         useroutput.append("\n" + "The queue has " + line.size() + " customers so far" + "\n" + 
         new_cus.toString() + " Has Joined the Queue " + " <=== WAITING" + "\n" + "\n"); 
        } 
        catch(Exception a) //ERROR handler for sleep method. 
        { 
         System.out.println("Intervals error: " + a); //Outputting the ERROR message. 
         System.exit(0); //If ERROR found exit system. 
        } 

       } 
      } 
      userinput.append("\n"); 
      useroutput.append("CUSTOMERS ARE WAITING !!!! !!!!" + "\n" + "\n"); 
      useroutput.append("Processing START !!!!" + "\n" + "\n"); 

      while (!line.isEmpty()) //While statement with for loop to remove each customer from LinkedList queue. 
      { 
       try 
       { 
        String cus = line.remove(); //Method to remove customer from LinkedList queue. 
        String time = getTime(); 
        Thread.sleep((processing_time() * 1000)/cashiers); //Sleep method to hold the processing by 1-3 seconds. 
        for (String s : line) 
        { 
         useroutput.append("[" + s.toString() + " " + "]" + "\n"); //Outputting each customer and using the ".name" method so customers are readable. 
        } 
        //Outputting the whole queue and stating who has joined the queue. 
        useroutput.append("\n" + "The queue has " + line.size() + " customers left" + "\n" + 
        cus.toString()+ " waited for " + time + " <=== SERVED" + "\n" + "\n"); 
       } 
       catch(Exception a) //ERROR handler for sleep method. 
       { 
        System.out.println("Cashiers_wait error: " + a); //Outputting the ERROR message. 
        System.exit(0); //If ERROR found exit system. 
       } 
      } 
      useroutput.append("Processing FINISHED !!!!" + "\n"); 
      System.out.println("working" + "\n" + "random arrival time is :" + intervals + "\n" + 
      "random processing time is :" + processing_time); 
     }; arrival.start(); 
    }; 

    public void append_output(final String text) 
    { 
     runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 

       useroutput.append(text); 
      } 
     }); 
    } 

    static String getTime() //Time Constructor 
    { 
     Calendar cal = Calendar.getInstance(); 
     time = dateFormat.format(cal.getTime()); //Getting the current system time. 
     return time; //Return time. 
    } 

    public int ran_interval() 
    { 
     Random rand = new Random(); //Random object created here. 
     int interval = this.intervals = rand.nextInt(2) + 1; //Random number between 1-2 is generated for customer arrival here. 

     return interval; 
    } 

    public int processing_time() 
    { 
     Random ran = new Random(); //Random object created here. 
     int time = this.processing_time = ran.nextInt(4) + 1; //Random number between 1-3 is generated for customer arrival here. 

     return time; 
    } 
} 
+1

Проблема в том, что вы блокируете поток пользовательского интерфейса и должны использовать задачу async. – edthethird

ответ

0

Похоже, ваша проблема заключается в том, что вы пытаетесь обновить пользовательский интерфейс из потока, который не предназначен для этого. Вы сделали функцию append_output, казалось бы, для этой цели, но затем ее никогда не использовали. Поскольку поток arrival не работает в пользовательском интерфейсе, он не может обновлять текстовое поле в режиме реального времени. Таким образом, в основном, вместо того, чтобы иметь нулевую цепочку useroutput.append s в вашем потоке поступления, измените их все на append_output(text), и это СЛЕДУЕТ исправить ваши проблемы.

+0

Я уже пробовал это, заменив все useroutput.append на appen_output (текст), но он по-прежнему выполняет ту же самую вещь, из-за которой все работает сначала, а затем выводит вывод TextView сразу. – user1898552

+0

Ах ладно. Что ж, если я не ошибаюсь, похоже, у вас нет начального условия для вашей функции «startProgress»? Хотя я не уверен, как работает ваш код, и я сомневаюсь, что это проблема. –

0

Сначала организуйте свой импорт и уважайте стиль кодирования Android. Я исправляю начало вашего кода.

private static Button mRun, mClear, mHome; 
private static EditText mUserInput; 
private static TextView mUserOutput; 

//LinkedList Customer Queue created here. 
public static Queue<String> line = new LinkedList<String>(); 
private static String time; //time variable. 
private static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); //DateFormat variable. 

private int intervals; 
private int cashiers; 
private int processing_time; 
Thread arrival; 
Handler handler, handlerr, handlerrr; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.station); 

    mClear = (Button)findViewById(R.id.button_clear); 
    mHome = (Button) findViewById(R.id.button_home); 
    mUserInput = (EditText) findViewById(R.id.s_userinput); 
    mUserOutput = (TextView) findViewById(R.id.s_useroutput); 

    if (mClear != null) { 
     mClear.setOnClickListener(this); 
    } 

    if (mHome != null) { 
     mHome.setOnClickListener(this); 
    } 
} 

public void onClick(View view) { 
    if (view == mClear) { 
     line.clear(); 
     mUserInput.setText(getString(R.string.line_cleared)); //Use string ressource ! 
     mUserOutput.setText(""); 
     System.out.println("cleared"); // Use string ressource 
    } else if (view == mHome) { 
     Intent a = new Intent(this, MainActivity.class); 
     startActivity(a); 
    } 
} 

Вы должны использовать поток, чтобы выполнить сложный расчет, получить ваши данные. Но инициализация пользовательского интерфейса не может быть выполнена в рабочем потоке. Вы должны быть в главной теме. Как обычно, все здесь: http://developer.android.com/guide/components/processes-and-threads.html

0

Действительно, вы должны использовать AsyncTask для обработки обновлений вашего интерфейса. Сделайте что-нибудь вроде:

private class updateTextView extends AsyncTask<String, String, Void> { 
    protected void doInBackground(String text) { 
     publishProgress(text) 
    } 
    protected void onProgressUpdate(String text) 
    { 
     useroutput.append(text) 
    } 
} 

над декларацией вашего класса.

Тогда каждый раз, когда вы хотите обновить TextView, вы просто делаете

new updateTextView().execute(text) 

Я не уверен, что на точный синтаксис этого, так как я не на компьютере с Android SDK установлен и таких, но это должно по крайней мере дать вам достаточно далеко, чтобы ваша среда разработки должна была справиться с остальными. Хотя это может быть неаккуратно или «плохой форме», оно должно заставить вас работать.

+0

Я не понимаю, откуда вы опубликовалиПрогресс (текст)? – user1898552

+0

Это встроенная функция AsyncTask, поэтому, когда вы расширяете «AsyncTask», вы наследуете эту функцию. 'onProgressUpdate' имеет доступ к пользовательскому интерфейсу, поэтому, когда ваш' doInBackground' вызывает 'publishProgress', он вызывает метод' onProgressUpdate' –

Смежные вопросы