Обновление textView во время выполнения кнопки? - Андроид

У меня есть процесс в кнопке (большой процесс). Я хочу обновить TextView с разными значениями. Нравиться:

  • Подключение...
  • Получение файлов...
  • Полный...

так далее..

Я использую setText(); void, но я получаю только последнее значение setText();, в этом случае:

estatEdit.setText("Полные товары!");

Вот мой код...

public class sincroGeneral extends Activity implements OnClickListener { 
    private static final String CATEGORIA = "libro"; 
    private static final String HOST = "192.168.1.165"; 
    private static final int PORT = 9889; 
    private static final int PORTDATOS = 9888;

    int filesize=6022386;
    int bytesRead;
    int current = 0;

    byte [] mybytearray  = new byte [filesize];

    byte buffer[] = new byte[1024];
    byte buffer2[] = new byte[1024];
    byte bufferArxiu[] = new byte[2048];
    int s;
    int s2;
    String Benvinguda; 
    String compra;
    EditText estatEdit;
    EditText editInflated;

    File myfile;

    SQLiteDatabase baseDatos;
    LinearLayout mainLayout;
    View view2;

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle bundle) { 
        super.onCreate(bundle); 
        setContentView(R.layout.sincrolayout); 



        Button b = (Button) findViewById(R.id.BotoEnviarSincro); 
        b.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {

                Button b = (Button) findViewById(R.id.BotoEnviarSincro);
                estatEdit = (EditText) findViewById(R.id.editSincro);

                estatEdit.setText("Enviando petición...");



                b.setClickable(false);
                b.setFocusable(false);
                b.setEnabled(false);


                ProcesRebre();

                b.setClickable(true);
                b.setFocusable(true);
                b.setEnabled(true);
            }
            });  
    }




    private void mostrarMensaje(String mensaje)
    {
        Toast.makeText(this, mensaje, 500).show();
    }


    private void ProcesRebre()
    {
        Socket sockDatos = null; 
        Socket clientSocket = null;



        DataOutputStream sortida;
        DataInputStream entrada;
        BufferedReader inFromServer;


        DataOutputStream sortidaDatos;
        DataInputStream entradaDatos;
        BufferedReader inFromServerDatos;






        try { 
            estatEdit.setText("Conectando...");

            clientSocket = new Socket(HOST, PORT);




            sortida = new DataOutputStream(clientSocket.getOutputStream());
            entrada = new DataInputStream(clientSocket.getInputStream());
            inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));




            sortida.writeBytes("FAS4-F@S-1-F@S- 1.0.152-F@S-");

            Log.i("Enviat","OK");

            clientSocket.setSoTimeout(30000);

            s =  entrada.read(buffer);
            String str = new String(buffer, "UTF8");


            clientSocket.setSoTimeout(0);


            Log.i("Rebut","OK");

           if(str.contains("PDA1-F@S-"))
           {
                sockDatos = new Socket(HOST, PORTDATOS);

               estatEdit.setText("Esperando archivo....");
                sortidaDatos = new DataOutputStream(sockDatos.getOutputStream());
                entradaDatos = new DataInputStream(sockDatos.getInputStream());
                inFromServerDatos = new BufferedReader(new InputStreamReader(sockDatos.getInputStream()));



                sortidaDatos.writeBytes("FAS4-F@S-1-F@S- 1.0.150-F@S-");


                if(sockDatos.isConnected())
                {
                     System.out.println("Conectat amb port 9888");
                }

                File carpetaSincro = new File(Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/");
                carpetaSincro.mkdirs();

                File ArxiuSincro = new File (Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/sincroorders.zip");

                if(ArxiuSincro.exists())
                {
                    ArxiuSincro.delete();
                }

                File ArxiuSincro2 = new File (Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/sincroorders.zip");
                ArxiuSincro2.createNewFile();


                sortida.writeBytes("FAS2-F@S-");

                String str2= "";



                clientSocket.setSoTimeout(30000);


                while(true && (!str2.contains("PDA7-F@S-") && !str2.contains("PDAERR1-F@S-")))
                    {
                        s2 = entrada.read(buffer2);  

                        str2 = new String(buffer2, "UTF8");

                    }

                clientSocket.setSoTimeout(0);

                String replace1 = str2.replace("PDA7-F@S-", "");
                String replace2 = replace1.replace(" ", "");
                String tamanyArxiu = replace2.replace("-F@S-ZIP","");


                int bufferZip = Integer.parseInt(tamanyArxiu);

                boolean in;
                s2 = 0;
                sockDatos.setSoTimeout(30000);
                RandomAccessFile archivo = new RandomAccessFile(Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/sincroorders.zip", "rw");
                long tamArxActual = 0;

                    while(bufferZip>=tamArxActual)
                    {
                        sockDatos.setSoTimeout(10000);
                        s2 = entradaDatos.read(bufferArxiu);
                        estatEdit.setText("Recibiendo archivo....");
                        archivo.write(bufferArxiu);

                        tamArxActual = archivo.length();

                        Thread.sleep(2);
                    }

                    sockDatos.setSoTimeout(0);

                    estatEdit.setText("Archivo recibido");

                    str2 = "";

                    clientSocket.setSoTimeout(30000);

                    while(true && (!str2.contains("PDA3-F@S-") && !str2.contains("PDAERR1-F@S-")))
                    {
                        s2 = entrada.read(buffer2);  

                        str2 = new String(buffer2, "UTF8");

                    }

                    clientSocket.setSoTimeout(0);

                    if(str2.contains("PDA3-F@S-"))
                    {
                        sortida.writeBytes("FAS7-F@S-");
                        Thread.sleep(2000);

                        sortida.writeBytes("FAS6-F@S-");
                    }




                    sockDatos.close();
                    clientSocket.close();


                    String pathZip = Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/sincroorders.zip";
                    String directoriExtraccio = Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/";
                    String pathTxt = Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/SincrofitPC.txt";
                    UnzipUtility unzipper = new UnzipUtility();

                    try {
                        unzipper.unzip(pathZip, directoriExtraccio);
                    } catch (Exception ex) {
                        System.out.print("No s'ha pogut descomprimir l'arxiu");
                        ex.printStackTrace();
                    }

                    File f = new File(Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/SincrofitPC.dll");
                    f.renameTo(new File(Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/SincrofitPC.txt"));


                    importarSincro();





           }


        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }




    private void importarSincro() throws SQLException, IOException
    {

        int contador = 0;
        String LiniaSQL;


        FileInputStream fstream = new FileInputStream(Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/SincrofitPC.txt");
        DataInputStream DataInFile = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream(Environment.getExternalStorageDirectory()+"/OrdersCE/Syncro/SincrofitPC.txt"), "Latin-1"));

        String FinalSQL = "";

        baseDatos = openOrCreateDatabase("BBDD", MODE_WORLD_WRITEABLE, null);

        baseDatos.execSQL("BEGIN");
        while ((LiniaSQL = br.readLine()) != null)   {



            if(contador > 0)
            {
                FinalSQL = LiniaSQL.replace("***** ", "");
                if(FinalSQL.contains("DELETE") && !FinalSQL.contains("DELETE FROM"))
                {
                    FinalSQL = FinalSQL.replace("DELETE", "DELETE FROM");

                    try{
                        baseDatos.execSQL(FinalSQL);
                    }catch(SQLiteException e){


                    }
                }
                else
                {
                    try{
                        baseDatos.execSQL(FinalSQL);
                    }catch(SQLiteException e){


                    }
                }






                LiniaSQL = "";
            }

            contador++;

        }
        baseDatos.execSQL("COMMIT");
        estatEdit.setText("Tareas completadas!");
        baseDatos.close();



    }


    /////////////////////////////////////////


    public static String deserializeString(File file)
              throws IOException {
                  int len;
                  char[] chr = new char[4096];
                  final StringBuffer buffer = new StringBuffer();
                  final FileReader reader = new FileReader(file);
                  try {
                      while ((len = reader.read(chr)) > 0) {
                          buffer.append(chr, 0, len);
                      }
                  } finally {
                      reader.close();
                  }
                  return buffer.toString();
              }




    public void onClick(View arg0) {
        // TODO Auto-generated method stub

    }

}

Заранее спасибо!

Дэйвид.


person Ezrou    schedule 24.09.2012    source источник


Ответы (3)


Интернет-соединение является блокирующим действием, т. е. оно блокирует пользовательский интерфейс до тех пор, пока действие не будет завершено (поэтому отображается только последнее обновление). Вы должны переместить его в поток (или даже лучше в AsyncTask). Но тогда у вас возникает другая проблема: вы не можете обновлять пользовательский интерфейс вне основного потока. Итак, вы должны использовать обработчик для обновления пользовательского интерфейса.

person Mohamed_AbdAllah    schedule 24.09.2012
comment
можете привести небольшой пример? - person Ezrou; 24.09.2012
comment
Проверьте это (developer.android.com/guide/components/) и этот developer.android.com/reference/android/os/ AsyncTask.html - person Mohamed_AbdAllah; 24.09.2012

Вы выполняете сетевую операцию в основном потоке, обратите внимание на то, что здесь Android работает в одном основном потоке, поэтому, если вы выполняете какую-либо трудоемкую операцию с поставщиками услуг/активности/контента и т. д., она заблокирует ваш основной поток и, следовательно, все вещи будут выглядят так, как будто они заблокированы/не отвечают, на самом деле вы получите сообщение ANR через несколько секунд.

в заключение, следуйте этому подходу

  1. Переместите обширный сетевой код в отдельный поток
  2. Реализовать механизм обработки сообщений для обновления пользовательского интерфейса в основном потоке (Handler/Looper).

чтобы помочь вам в дальнейшем, Android предоставляет вам класс AsynTask для этой цели. Вы можете выполнить свою операцию в doInBackground() и при условии, что вы можете обновить свой пользовательский интерфейс через onProcessUpdate()

надеюсь это поможет.

person Techfist    schedule 24.09.2012

Если вы запустите этот процесс в потоке пользовательского интерфейса, это может вызвать диалоговое окно с сообщением «Приложение
не отвечает». Поэтому я рекомендую выполнить эту задачу либо в AsyncTask или служба

Вы можете обновить свой текстовый вид в

onPreExecute()
onProgressUpdate()
onPostExecute() functions in AsyncTask.

Например, для загрузки файла

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
person Dev.Sinto    schedule 24.09.2012