当我用插座垃圾收集循环 [英] Garbage Collector looping when I use socket
问题描述
我包括我的项目一个插座,它的工作好。 我的服务器收到了我的请求,我的应用程序接收到的答案。 几乎一切权利,除了垃圾收集器开始一个循环,并没有停下来。
I'm including a socket in my project and it's working good. My server received my request and my app received the answer. Almost everything right except for the garbage collector start a looping and didn't stop.
我之前(包括谁被称为插座的意图),杀死了所有的意图,我试过socket.disconnect,我闭上我的应用程序(和GC仍在运行),但没有奏效。
I killed all the intents before (including the intent who called the socket), I tried the socket.disconnect, I closed my application (and the GC still running) but didn't work.
在GC只是停止,如果我再次运行我的应用程序或强制停止的配置。
The GC just stops if I Run my app again or force stop in the configurations.
我的code和日志
public class ListaRestaurantesActivity extends Activity implements NumberPicker.OnValueChangeListener {
private static Context context;
private static Dialog dialog;
private static NumberPicker numberPickerDialog;
private Button botaoOkDialog;
private Button botaoCancelDialog;
private ListView lv_telaListaRestaurante_Lista;
private ListaRestaurantesAdapter lra;
private List<ListaRestauranteTO> listaRestauranteTO;
public static void entraMesaAprovado(String idRestaurante) {
Intent mesa = new Intent(context, SelectedRestauranteActivity.class);
mesa.putExtra("numeroMesa", String.valueOf(numberPickerDialog.getValue()));
mesa.putExtra("idRestaurante", idRestaurante);
context.startActivity(mesa);
dialog.dismiss();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_restaurante);
lv_telaListaRestaurante_Lista = (ListView) findViewById(R.id.lv_telaListaRestaurante_Lista);
dialog = new Dialog(ListaRestaurantesActivity.this);
dialog.setContentView(R.layout.view_alert_dialog);
dialog.setTitle(R.string.txt_alertDialog_Cabecalho);
numberPickerDialog = (NumberPicker) dialog.findViewById(R.id.np_viewAlertDialog_NumeroMesa);
botaoOkDialog = (Button) dialog.findViewById(R.id.bt_viewAlertDialog_OK);
botaoCancelDialog = (Button) dialog.findViewById(R.id.bt_viewAlertDialog_Cancel);
new AsyncTask<Context, Void, Void>() {
private UtilWS ws;
private JsonElement jsonElement;
private Gson gson = new Gson();
private Type type = new TypeToken<ListaRestauranteTO>() { }.getType();
@Override
protected void onPreExecute() {
super.onPreExecute();
ws = new UtilWS();
listaRestauranteTO = new ArrayList<ListaRestauranteTO>();
}
@Override
protected Void doInBackground(Context... params) {
context = params[0];
String[] postResult = ws.post(UtilWS.URL_LISTA_LOCAIS, "");
if (postResult[0].equals("200")) {
JsonObject temp = new JsonParser().parse(postResult[1]).getAsJsonObject();
JsonArray jsonArray = temp.getAsJsonArray("restaurantes");
for (int i = 0; i < jsonArray.size(); i++) {
jsonElement = jsonArray.get(i);
listaRestauranteTO.add((ListaRestauranteTO) gson.fromJson(jsonElement, type));
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
lra = new ListaRestaurantesAdapter(context, listaRestauranteTO);
lv_telaListaRestaurante_Lista.setAdapter(lra);
}
}.execute(this);
lv_telaListaRestaurante_Lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
Log.i("Contents", " = " + view.getTag());
show((String) view.getTag());
}
});
}
public void show(final String idRestaurante)
{
String[] listaMesas = null;
for (int i = 0; i < listaRestauranteTO.size(); i++) {
for (int j = 0; j < listaRestauranteTO.get(i).getMesas().size(); j++) {
if (listaRestauranteTO.get(i).getMesas().get(j).getRestaurante_id().equals(idRestaurante)) {
if (listaMesas == null) {
listaMesas = new String[listaRestauranteTO.get(i).getMesas().size()];
}
listaMesas[j] = listaRestauranteTO.get(i).getMesas().get(j).getNumero();
} else {
j = listaRestauranteTO.get(i).getMesas().size() + 1;
}
}
}
numberPickerDialog.setMinValue(1);
numberPickerDialog.setMaxValue(listaMesas.length);
numberPickerDialog.setDisplayedValues(listaMesas);
numberPickerDialog.setWrapSelectorWheel(false);
numberPickerDialog.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
numberPickerDialog.setOnValueChangedListener(this);
botaoOkDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
new ReceiveCallback(context, String.valueOf(numberPickerDialog.getValue()), idRestaurante);
return null;
}
}.execute();
}
});
botaoCancelDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
}
}
class ReceiveCallback implements IOCallback {
private SocketIO socket = new SocketIO();
private FBSessionsManager fbSessionsManager;
private Context context;
private String idRestaurante;
public ReceiveCallback(Context context, String mesaNumero, String idRestaurente) {
this.context = context;
idRestaurante = idRestaurente;
fbSessionsManager = new FBSessionsManager(this.context);
try {
socket.connect("http://192.168.25.5:3001/", this);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
socket.emit("solicita-mesa", new JSONObject().put("userId", fbSessionsManager.getStoredPrivateSession()[1])
.put("mesaNumero", mesaNumero).put("restauranteId", idRestaurente));
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onMessage(JSONObject json, IOAcknowledge ack) {
try {
Log.i("Server said:" + json.toString(2), ".");
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onMessage(String data, IOAcknowledge ack) {
Log.i("Server said: " + data, ".");
}
@Override
public void onError(SocketIOException socketIOException) {
Log.i("an Error occured", ".");
socketIOException.printStackTrace();
}
@Override
public void onDisconnect() {
Log.i("Connection terminated.", ".");
}
@Override
public void onConnect() {
Log.i("Connection established", ".");
Intent i = new Intent(context, MensagemAguardeActivity.class);
context.startActivity(i);
}
@Override
public void on(String event, IOAcknowledge ack, Object... args) {
JSONObject object = (JSONObject) args[0];
if (event.equals("confirmacao")) {
try {
if ((Boolean) object.get("confirmado")) {
ListaRestaurantesActivity.entraMesaAprovado(idRestaurante);
}
socket.disconnect();
} catch (JSONException e) {
e.printStackTrace();
}
}
if (event.equals("remove-prato")) {
}
}
}
01-29 12:02:10.161 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 6589K, 30% free 16328K/23076K, paused 1ms+2ms, total 31ms
01-29 12:02:16.341 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 18334K, 60% free 12654K/31144K, paused 1ms+1ms, total 53ms
01-29 12:02:22.471 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14657K, 60% free 12646K/31144K, paused 1ms+11ms, total 64ms
01-29 12:02:28.591 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14648K, 54% free 12651K/27460K, paused 1ms+1ms, total 52ms
01-29 12:02:34.731 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14654K, 54% free 12649K/27464K, paused 11ms+0ms, total 63ms
01-29 12:02:40.841 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14654K, 54% free 12646K/27464K, paused 1ms+1ms, total 53ms
01-29 12:02:46.991 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14650K, 54% free 12652K/27464K, paused 1ms+1ms, total 52ms
01-29 12:02:53.091 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14658K, 54% free 12654K/27468K, paused 1ms+1ms, total 52ms
01-29 12:02:59.221 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14658K, 54% free 12642K/27468K, paused 1ms+1ms, total 47ms
01-29 12:03:05.591 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14646K, 54% free 12641K/27468K, paused 12ms+1ms, total 66ms
01-29 12:03:11.781 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14646K, 54% free 12649K/27456K, paused 12ms+13ms, total 75ms
01-29 12:03:17.951 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14654K, 54% free 12648K/27464K, paused 1ms+11ms, total 63ms
01-29 12:03:24.071 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14654K, 54% free 12644K/27464K, paused 11ms+1ms, total 64ms
01-29 12:03:30.191 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14650K, 54% free 12654K/27460K, paused 1ms+1ms, total 52ms
01-29 12:03:36.331 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14658K, 54% free 12648K/27468K, paused 12ms+11ms, total 74ms
01-29 12:03:42.471 8994-8996/br.com.timo.xxxx D/dalvikvm﹕ GC_CONCURRENT freed 14650K, 54% free 12642K/27468K, paused 11ms+0ms, total 63ms
我需要做些什么来阻止这种GC循环?它消耗了大量的电池。
What I need to do to stop this GC looping? It's consuming a lot of battery.
感谢和问候。
更新
我用这个socket库。
I'm using this socket library.
更新2014年2月4日
一些测试后,我发现了一个线索。 socket.disconnect造成循环在我的应用程序和方法,现在我有另外一个问题。
After some tests, I found a clue. The method socket.disconnect caused the looping in my application and now I'm with another problem.
我应该怎么办?如果我执行的方法socket.disconnect GC将运行无限,如果我不使用socket.disconnect应用程序将留在打开和工作,会大量消耗电池的插槽。
What should I do? If I execute the method socket.disconnect the GC will run infinitely and if I don't use the socket.disconnect the application will stay with the socket opened and working and will consume a lot of battery.
更新2014年2月6日
我还没有解决这个问题,但我读SocketIO的问题GitHub上,我看到了很多的开发者提供了同样的错误,并直到今天问题仍然存在。
I still have not solved this question but I read the issues of SocketIO on github and I saw a lot of developers with the same error and until today the problem continues.
链接SocketIO项目的问题是在这里:的问题项目SocketIO
The link to the issues of SocketIO project is here: Issues Project SocketIO
推荐答案
我在Android中调用socket.disconnect时有同样的问题()。
I had the same issue in Android when calling the socket.disconnect().
下面是它是如何固定的。
Here is how it was fixed.
从 https://github.com结帐socket.io-Java的客户端项目/Gottox/socket.io-java-client ;
下载Java-的WebSocket-1.3.0.jar;
Download the Java-WebSocket-1.3.0.jar;
替换WebSocket.jar在socket.io项目的Java的WebSocket-1.3.0.jar的库文件;
Replace the WebSocket.jar in the lib file of socket.io project with java-websocket-1.3.0.jar;
使用Ant来构建的socket.io-Java的客户端罐;
Use ant to build the socket.io-java-client to jar;
然后用新的,你只是建立更换socketio.jar。
Then replace the socketio.jar with the new one you just build.
希望这有助于。
这篇关于当我用插座垃圾收集循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!