Java android emulator内存选项阻止我的应用程序运行

Java android emulator内存选项阻止我的应用程序运行,java,android,eclipse,android-emulator,Java,Android,Eclipse,Android Emulator,我的eclipse仿真器似乎有很大的问题,不知道是ram大小还是代码。在我看来,我的代码应该运行,就像在我的JavaNetBeans项目中一样 每次我运行应用程序并按下connect按钮时,我都想获取服务器发送回的字符串,然后对其进行处理。我有一个读取字符串的进程连接方法,但是当我返回它并实际使用返回的内容时,我的模拟器崩溃了 我的代码如下: package za.nmmu.wrap302.networks.example02; import java.io.IOException;

我的eclipse仿真器似乎有很大的问题,不知道是ram大小还是代码。在我看来,我的代码应该运行,就像在我的JavaNetBeans项目中一样

每次我运行应用程序并按下connect按钮时,我都想获取服务器发送回的字符串,然后对其进行处理。我有一个读取字符串的进程连接方法,但是当我返回它并实际使用返回的内容时,我的模拟器崩溃了

我的代码如下:

  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();
    }

}
}

模拟器中的ram是否会影响这一点?我做错了什么?

您需要使用异步任务来产生上传到其他线程的结果。Android工作在单线程模型上,使用同一线程生成HTTPRequest可能会导致致命的异常。创建一个异步任务并将其上传到其他任务

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

        }

这是logcat通过主线程告诉您的:正在执行太多任务。

亲爱的,请发布您的整个logcat。您可以通过使用完全不同的模拟器并检查问题是否仍然存在,来测试问题的根源是否在ADT模拟器上。为此,我建议你试试Genymotion我和他们没有关系。。。因为它通常比股票仿真器性能更好。如果将我的整个ProcessConnection方法放在一个扩展runnable的run方法中,并且每次需要从服务器返回接收到的字符串时都运行该线程,这是否不正确?否则,如何将ProcessConnection放入AsyncTaskRunner类中?您的回答很有道理,但我有点困惑如何将其应用到代码中。是的,您可以将整个processConnection方法放在run方法中,并使用Async类调用它。
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

        }