Autore Topic: Gestire button listener mediante AsyncTask  (Letto 560 volte)

Offline iMatteo

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Gestire button listener mediante AsyncTask
« il: 05 Giugno 2014, 19:41:48 CEST »
0
Salve a tutti ho implementato AsyncTask nella mia app per poter creare un Socket(si collega ad un server java sul mio pc) all'avvio della mia app però quando provo ad associare un listener al bottone per inviare delle informazioni al server, l'app va in crash dandomi come errore

Codice: [Seleziona]
android.os.networkonmainthreadexception
il codice è il seguente:

Codice: [Seleziona]
public class Login extends ActionBarActivity {
       
        private TextView register;
        private TextView connection;
        private Button login;
        private EditText email;
        private EditText password;
        private static ObjectOutputStream oos;
        private static ObjectInputStream ois;
        Socket client;
       
        private class myTask extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected String doInBackground(String... params) {

           try {
                 client = new Socket("10.10.2.209", 4444);  //connect to server
                 oos = new ObjectOutputStream(client.getOutputStream());
                 ois = new ObjectInputStream(client.getInputStream());
                 
                 String string = ois.readUTF();
                         connection.setText(string);
                 
           }catch (ConnectException e){
                   return "Host not found";
           }catch (IOException e) {
                   return "Exception Caught";
           }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
               
            super.onPostExecute(result);   
           
            if ("Host not found".equalsIgnoreCase(result)){
                    Toast.makeText(getApplicationContext(), "Host not found" ,Toast.LENGTH_LONG).show();
            }else if("Exception Caught".equalsIgnoreCase(result)){
                    Toast.makeText(getApplicationContext(), "Connection error" ,Toast.LENGTH_LONG).show();
            }else{
                     Toast.makeText(getApplicationContext(), "Connection established" ,Toast.LENGTH_LONG).show();
             }
        }
        }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        register = (TextView)findViewById(R.id.register);
        login = (Button)findViewById(R.id.login);
        email = (EditText)findViewById(R.id.email);
        password = (EditText)findViewById(R.id.password);
        connection = (TextView)findViewById(R.id.connection);
       
        new myTask().execute();

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
       
        register.setOnClickListener(new View.OnClickListener(){

                        @Override
                        public void onClick(View arg0) {
                                startActivity(new Intent(Login.this, Register.class));
                        }
                });
               
        login.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                               
                                try {
                                       
                                        oos.writeUTF("LOGIN");
                        oos.flush();
                       
                        String emailText = email.getText().toString();
                                oos.writeUTF(emailText);
                                oos.flush();
                                   
                                String passwordText = password.getText().toString();
                                oos.writeUTF(passwordText);
                                oos.flush();

                                } catch (IOException e) {
                                        e.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.login, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_login, container, false);
            return rootView;
        }
    }

}

Mi sapete dire come devo gestire l'evento del bottone utilizzando AsyncTask?
Grazie a tutti

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestire button listener mediante AsyncTask
« Risposta #1 il: 05 Giugno 2014, 20:11:54 CEST »
0
Tutta la parte di codice dove crei il socket e gestisci la connessione di rete, la implementi dentro l'asynctask. Al click sul bottone, mandi in esecuzione l'asynctask.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline iMatteo

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:Gestire button listener mediante AsyncTask
« Risposta #2 il: 05 Giugno 2014, 20:15:59 CEST »
0
e questa parte di codice

Codice: [Seleziona]
try {
                                       
                                        oos.writeUTF("LOGIN");
                        oos.flush();
                       
                        String emailText = email.getText().toString();
                                oos.writeUTF(emailText);
                                oos.flush();
                                   
                                String passwordText = password.getText().toString();
                                oos.writeUTF(passwordText);
                                oos.flush();

                                } catch (IOException e) {
                                        e.printStackTrace();
                                //Toast.makeText(getApplicationContext(), string ,Toast.LENGTH_LONG).show();
                                }       

dove la devo mettere?

iClaude

  • Visitatore
Re:Gestire button listener mediante AsyncTask
« Risposta #3 il: 06 Giugno 2014, 17:02:08 CEST »
0
e questa parte di codice

Codice: [Seleziona]
try {
                                       
                                        oos.writeUTF("LOGIN");
                        oos.flush();
                       
                        String emailText = email.getText().toString();
                                oos.writeUTF(emailText);
                                oos.flush();
                                   
                                String passwordText = password.getText().toString();
                                oos.writeUTF(passwordText);
                                oos.flush();

                                } catch (IOException e) {
                                        e.printStackTrace();
                                //Toast.makeText(getApplicationContext(), string ,Toast.LENGTH_LONG).show();
                                }       

dove la devo mettere?

Tutte le operazioni di rete vanno messe fuori dal thread della gui. In caso contrario c'è una protezione che manda in crash l'app.

Offline iMatteo

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Re:Gestire button listener mediante AsyncTask
« Risposta #4 il: 06 Giugno 2014, 19:52:27 CEST »
0
si questo lo so però io volevo fare in modo che all'avvio si crea il socket e poi quando clicco sul tasto login lui manda le richieste al server...come devo modificare il codice per far questo?

iClaude

  • Visitatore
Re:Gestire button listener mediante AsyncTask
« Risposta #5 il: 06 Giugno 2014, 20:21:28 CEST »
0
si questo lo so però io volevo fare in modo che all'avvio si crea il socket e poi quando clicco sul tasto login lui manda le richieste al server...come devo modificare il codice per far questo?

L'OutputStream l'hai creato all'inizio per risparmiare tempo? Allora crea un altro thread e mettici dentro le operazioni di rete: l'OnClickListener funziona nel thread della GUI, quindi lì dentro non puoi gestire operazioni di rete.