2014-06-13 2 views
0

Je semble avoir des problèmes majeurs avec mon émulateur eclipse et je ne sais pas si c'est la taille du ram ou mon code. À mon avis, mon code devrait fonctionner, comme c'est le cas dans mon projet java netbeans.Les options de mémoire de l'émulateur android arrêtent mon application

Chaque fois que j'exécute mon application et que j'appuie sur le bouton de connexion, je veux obtenir la chaîne que le serveur envoie et ensuite faire quelque chose avec. J'ai une méthode « de connexion de processus » qui se lit dans la chaîne, mais quand je reviens et utilise effectivement ce qui est retourné, mon émulateur se bloque

Mon code est le suivant:

package za.nmmu.wrap302.networks.example02; 

    import java.io.IOException; 
    import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.util.ArrayList; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.KeyEvent; 
    import android.view.View; 
import android.view.View.OnKeyListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
    import android.widget.Toast; 

public class MainActivity extends Activity { 
private ListView lstMessages; 
private EditText txtMessage; 

private ArrayList<String> messages; 
private ArrayAdapter<String> adapter; 
String message = ""; 
private ServerConnection connection; 

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

    // get references to View objects 
    txtMessage = (EditText) findViewById(R.id.txtMessage); 
    lstMessages = (ListView) findViewById(R.id.lstMessages); 

    // set up adapter 
    messages = new ArrayList<String>(); 
    adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, messages); 
    lstMessages.setAdapter(adapter); 

    // attach event listener 
    txtMessage.setOnKeyListener(new OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if ((keyCode == KeyEvent.KEYCODE_ENTER) 
        && (event.getAction() == KeyEvent.ACTION_DOWN)) { 
       try { 
        onTxtMessageEnterPressed(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return true; 
      } 

      return false; 
     } 
    }); 
} 

public void onBtnConnectClicked(View view) { 
    clearMessages(); 
    connection = new ServerConnection(); 
    connection.start(); 
} 

public void onTxtMessageEnterPressed() throws IOException { 
    if (connection != null) { 
     String message = txtMessage.getText().toString(); 
     txtMessage.getText().clear(); 
     connection.sendData(message); 
    } 
} 

public void addMessage(String message) { 
    adapter.add(message); 
} 

public void clearMessages() { 
    adapter.clear(); 
} 

// the thread that will be communicating with the server 
public class ServerConnection extends Thread { 
    // the I/O streams that will be receiving/sending data from/to the 
    // server 
    private ObjectOutputStream output; 
    private ObjectInputStream input; 

    private Socket client; 

    @Override 
    public void run() { 
     try { 
      // Step 1: Create a Socket to make connection 
      connectToServer(); 

      // Step 2: Get the input and output streams 
      getStreams(); 

      // Step 3: Process connection 
      processConnection(); 


      // Step 4: Close connection 
      //closeConnection(); 
     } catch (IOException e) { 
      Log.e("CONNECTION", e.getMessage()); 
     } 
    } 

    public void addMessage(final String message) { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       MainActivity.this.addMessage(message); 
      } 
     }); 
    } 

    private void connectToServer() throws IOException { 
     addMessage("Attempting connection\n"); 
     client = new Socket("10.0.0.7", 5001); 
     addMessage("Connected to: " + client.getInetAddress().getHostName()); 
    } 

    private void getStreams() throws IOException { 
     output = new ObjectOutputStream(client.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(client.getInputStream()); 
     addMessage("Got I/O streams"); 
    } 

      //I would like to call the message below and return it to anywhere else in the code 

    private String processConnection() throws IOException 
    {  
     do { 
      try { 
       message = (String) input.readObject(); 
       addMessage(message); 
       return message; 

      } 
      catch (ClassNotFoundException classNotFoundException) 
      { 
       addMessage("ERROR: Unknown object type received"); 
      } 
      return message; 
     } while (!message.equals("SERVER>>> TERMINATE")); 
    } 

    private void sendData(String message) { 
     try { 
      output.writeObject(message); 
      output.flush(); 
      addMessage("CLIENT>>>" + message); 
     } catch (IOException ioException) { 
      addMessage("ERROR: Error writing object"); 
     } 
    } 

    private void closeConnection() throws IOException { 
     addMessage("Closing connection"); 
     output.close(); 
     input.close(); 
     client.close(); 
    } 

} 
} 

Mon application ne semble juste se bloquer chaque fois que j'appelle la méthode processConnection de n'importe où. Mon serveur décroche que j'ai envoyé le message, mais mon client ne lit pas.

http://i.stack.imgur.com/cNu7m.png

Mon logcat montre:

06-13 08:18:00.460: D/dalvikvm(1145): GC_FOR_ALLOC freed 45K, 4% free 3076K/3204K, paused 293ms, total 296ms 
06-13 08:18:00.460: I/dalvikvm-heap(1145): Grow heap (frag case) to 3.687MB for 635812-byte allocation 
06-13 08:18:00.530: D/dalvikvm(1145): GC_FOR_ALLOC freed 1K, 4% free 3695K/3828K, paused 55ms, total 55ms 
06-13 08:18:02.220: I/Choreographer(1145): Skipped 172 frames! The application may be doing too much work on its main thread. 
06-13 08:18:02.240: D/gralloc_goldfish(1145): Emulator without GPU emulation detected. 
06-13 08:18:03.100: I/Choreographer(1145): Skipped 198 frames! The application may be doing too much work on its main thread. 
06-13 08:18:27.660: E/InputEventSender(1145): Exception dispatching finished signal. 
06-13 08:18:27.660: E/MessageQueue-JNI(1145): Exception in MessageQueue callback: handleReceiveCallback 

Est-ce que le bélier dans l'émulateur affectent cela? Qu'est-ce que je fais mal?

+2

chère s'il vous plaît poster tout votre Logcat –

+0

Vous pouvez tester si la source du problème est avec l'émulateur ADT, en utilisant un émulateur différent et en vérifiant si le problème existe toujours. Pour cela, je vous recommande d'essayer Genymotion (je ne suis pas affilié avec eux ...) car il fonctionne généralement mieux que l'émulateur "stock". –

Répondre

0

Vous devez utiliser la tâche asynchrone pour lancer le téléchargement dans un thread différent. Android fonctionne sur un seul modèle de thread et l'utilisation du même thread pour rendre HTTPRequest peut entraîner une exception FATAL. Créez une tâche asynchrone et créez-la.

AsyncTaskRunner runner = new AsyncTaskRunner(); 
runner.execute(<pass the required parameters here for file upload>); 

private class AsyncTaskRunner extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      //Call the function to upload the file here 

     } 

C'est ce que le logcat vous dit par thread principal fait trop de tâches.

+0

Serait-il incorrect de mettre toute ma méthode ProcessConnection dans une méthode run() (qui étend runnable) et d'exécuter ce thread chaque fois que j'ai besoin de renvoyer la chaîne reçue du serveur? Sinon, comment pourrais-je mettre mon ProcessConnection dans une classe AsyncTaskRunner? Votre réponse est logique, mais je suis un peu confus quant à la façon dont je l'appliquerais à mon code. – user1397978

+0

Oui, vous pouvez placer votre méthode processConnection entière dans une méthode d'exécution et l'appeler à l'aide de la classe Async. – G3M

Questions connexes