1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Duvidas com Threads em Java para a API do Android

Como deve ser a estrutura basica para usar uma thread secundaria que executa uma estrutura de repetição for ou while alem de executar um metodo de MainActivity criado por mim que altera um o settext() de um EditText que esta em MainActivity? eu tenho tentado alguma formas mais não tenho conseguido, sou novo em Java e mais ainda em android porém venho de outras linguagens meu programa esta funcionando so que enquanto executa o a suposta thread2 ele trava a interface ate acabar de executar a thread.

Este é o codigo atual ou seja o que não funciona;

package dev.micoli.mobileportscanner;

import java.io.IOException;
import java.net.Socket;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
    String ip;
    int startR, stopR;
    EditText target;
    EditText startP;
    EditText stopP;
    EditText result;
    Button launcher;
    boolean open = false;
    int port;

    Handler handler = new Handler();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        launcher = (Button)findViewById(R.id.button1);
        target = (EditText)findViewById(R.id.editText1);
        startP = (EditText)findViewById(R.id.editText2);
        stopP = (EditText)findViewById(R.id.editText3);

        launcher.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ip = target.getText().toString();
                String start = startP.getText().toString();
                startR = Integer.parseInt(start);
                String stop = stopP.getText().toString();
                stopR = Integer.parseInt(stop);
                onStart();
            }
        });

    }

    @Override
    public void onStart(){
        super.onStart();
        result.setText("");
        Thread myThread = new Thread(scanTask, "loop");
        myThread.start();    
    }

    private Runnable drawTask = new Runnable() {

        @Override
        public void run() {
            if(open != false){
                result.append("Port: " + port + "Open");
            }
            else{
                result.append("Port: " + port + "Close");
            }

        }
    };

    private Runnable scanTask = new Runnable() {

        @Override
        public void run() {
            for(int i = startR;i <= stopR;i++){
                try {
                    Socket mySocket = new Socket(ip, i);
                    mySocket.close();
                    open = true;
                    port = i;
                    try {
                        Thread.sleep(1000);
                        handler.post(drawTask);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } catch (IOException e) {
                    open = false;
                    try {
                        Thread.sleep(1000);
                        handler.post(drawTask);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }

        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

E este é o que funciona porem a Thread nao funciona:

package com.micoli.portscanner;

import java.io.IOException;
import java.net.Socket;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
    private String ip;
    private int startR, stopR;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button launcher = (Button)findViewById(R.id.button1);
        final EditText target;
        final EditText startP;
        final EditText stopP;
        target = (EditText)findViewById(R.id.editText1);
        startP = (EditText)findViewById(R.id.editText2);
        stopP = (EditText)findViewById(R.id.editText3);

        launcher.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ip = target.getText().toString();
                /*startR = Integer.valueOf(startP.getText());
                stopR = Integer.valueOf(stopP.getText());*/
                String start = startP.getText().toString();
                startR = Integer.parseInt(start);
                String stop = stopP.getText().toString();
                stopR = Integer.parseInt(stop);
                loopScan(ip, startR, stopR);
            }
        });

    }

    private void loopScan(String ip2, int startR2, int stopR2) {
        Thread myThread = new Thread();
        myThread.setPriority(Thread.MIN_PRIORITY);
        myThread.start();
        EditText result = (EditText)findViewById(R.id.editText4);
        result.setText("");

        for(int i = startR2;i <= stopR2;i++){
            try {
                Socket mySocket = new Socket(ip2, i);
                mySocket.close();
                result.append("porta " + i + " aberta\n");
            } catch (IOException e) {
                result.append("porta " + i + " fechada\n");
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

Desde já obrigado pela ajuda :)

  • Obs: desculpem por eu não ter implementado o tratamento de erros, eu tinha implementado e perdi o arquivo mais implementare de novo;

    Jose Maria Micoli   15 de mai de 2013
  • Veja a minha resposta. Talvez lhe ajude.

    Felipe   15 de mai de 2013
  • Jose, não precisa editar o tópico colocando (Resolvido) no título, apenas marcar a resposta certa já é o suficiente.

    Chico Sokol   17 de mai de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

3 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags android java threads ou faça a sua própria pergunta.