2014-12-21 3 views
0

Я начинаю разработку приложений для Android. Недавно начал разрабатывать чат-приложение. Я достиг основных функций обмена сообщениями на клиентском сервере. Я столкнулся с проблемой, что андроидная активность перезапускается автоматически. Из-за этого создаются новые экземпляры представлений и не видны сообщения в виде списка.Почему моя активность перезапускается автоматически?

Из следов я вижу, что действие остановлено и создано автоматически. Следовательно, новый экземпляр MAIN-активности создается снова.

12-21 14:47:50.744 1913-1913/? I/System.out﹕ **********MainActivity.onCreate()-->[email protected] 
12-21 14:48:11.209 1913-1913/chat.com.android_client I/System.out﹕ ********onStop() app is killed!!! 
12-21 14:48:11.216 1913-1913/chat.com.android_client I/System.out﹕ **********MainActivity.onCreate()-->[email protected] 

[MainActivity.java]

package com.chat.client; 

import android.app.Activity; 
import android.database.DataSetObserver; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AbsListView; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 

import com.chat.client.config.ChatProtocolConstants; 
import com.chat.client.config.ServerUriConstants; 
import com.chat.client.connect.ChatServerListener; 
import com.chat.client.connect.ChatWebSocketHandler; 
import com.chat.client.connect.ConnectionManager; 

import chat.com.android_client.R; 
import de.tavendo.autobahn.WebSocketHandler; 


public class MainActivity extends Activity { 

    private ChatArrayAdapter chatArrayAdapter; 
    private ListView listView; 
    private EditText chatEditText; 
    private Button buttonSend; 

    private boolean side = false; 

    private ConnectionManager connectionManager; 
    private final String from = "Ramu", to = "Omkar"; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     System.out.println("**********MainActivity.onCreate()-->"+this); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     buttonSend = (Button) findViewById(R.id.buttonSend); 

     listView = (ListView) findViewById(R.id.listView1); 


     chatArrayAdapter = new ChatArrayAdapter(getApplicationContext(), R.layout.activity_chat_singlemessage); 

     chatEditText = (EditText) findViewById(R.id.chatText); 

     chatEditText.setOnKeyListener(new View.OnKeyListener() { 
      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { 
        ChatMessage chatMessage = new ChatMessage(false, chatEditText.getText().toString()); 
        return sendChatMessage(chatMessage); 
       } 
       return false; 
      } 

     }); 

     buttonSend.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ChatMessage chatMessage = new ChatMessage(false, chatEditText.getText().toString()); 
       sendChatMessage(chatMessage); 
      } 
     }); 

     listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
     listView.setAdapter(chatArrayAdapter); 

     chatArrayAdapter.registerDataSetObserver(new DataSetObserver() { 
      @Override 
      public void onChanged() { 
       super.onChanged(); 
       listView.setSelection(chatArrayAdapter.getCount() - 1); 
      } 
     }); 

     // Connect to chat server 
     connectToServer(); 

    } 

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

     System.out.println("********onStop() app is killed!!!"); 
    } 

    private boolean sendChatMessage(ChatMessage chatMessage) { 
     connectionManager.sendMessage(from + ChatProtocolConstants.DELIMITER + to + ChatProtocolConstants.DELIMITER + chatMessage.message); 
     return updateChatList(chatMessage); 
    } 

    private boolean updateChatList(ChatMessage chatMessage) { 
     chatArrayAdapter.add(chatMessage); 
     chatEditText.setText(""); 

     return true; 
    } 


    private void connectToServer() { 

     connectionManager = ConnectionManager.getInstance(); 
     WebSocketHandler chatWebSocketHandler = new ChatWebSocketHandler(from); 

     ((ChatWebSocketHandler) chatWebSocketHandler).setWebSocketListener(new ChatServerListener() { 
                       @Override 
                       public void messageReceived(String message) { 
                        ChatMessage chatMessage = new ChatMessage(true, message); 
                        System.out.println("Received message from web socket handler: " + message); 
                        updateChatList(chatMessage); 
                       } 
                      } 
     ); 
     connectionManager.connect(ServerUriConstants.serverUri + ServerUriConstants.connectEndPoint, chatWebSocketHandler); 

    } 
} 

[activity_main.xml]

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="80dp"></ListView> 

<RelativeLayout 
    android:id="@+id/form" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:orientation="vertical"> 

    <EditText 
     android:id="@+id/chatText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_toLeftOf="@+id/buttonSend" 
     android:ems="10" 
     android:inputType="textMultiLine" /> 

    <Button 
     android:id="@+id/buttonSend" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/chatText" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:text="@string/button_send" /> 

</RelativeLayout> 

я cо(), чтобы проверить поведение, но это одно и то же. Таким образом, проблема не возникает из-за connectToServer().

Ниже эмулятор, который я использую в Android Studio, чтобы запустить это приложение Поскольку автоматический перезапуск деятельности не ожидается, что может быть здесь отсутствует. Пожалуйста, предложите.

+0

Вместо того чтобы пытаться предотвратить автоматические перезагрузки, попробуйте посмотреть, как вы можете разместить автоматические перезагрузки, сохраняя состояния экземпляров и защитное кодирование. Android предоставляет вам объект «Bundle», используйте его как можно больше. – initramfs

+0

Боли в попку, и хрупкой для загрузки. На самом деле гораздо безопаснее защищать код, отключив его - тогда вы не попадете в опасную ситуацию в первую очередь. Есть причина, почему почти все нетривиальные приложения отключают функциональность. Посмотрите даже на приложения с открытым исходным кодом Google. –

+0

@GabeSechan Интересно, удастся ли им когда-нибудь убрать этот шаблон дизайна. Хотя изменения и вероятные проблемы совместимости, вероятно, слишком велики, чтобы сделать это возможным. – initramfs

ответ

1

Да, есть проблема с эмулятором для Lollipop в android studio 1.0 и Ubuntu 14.04. Он дает следующее сообщение об ошибке:

12-21 15:47:02.512 1900-1916/chat.com.android_client W/EGL_emulation﹕ eglSurfaceAttrib not implemented 
12-21 15:47:02.512 1900-1916/chat.com.android_client W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6da4140, error=EGL_SUCCESS 

Из-за этого OnCreate() была вызывался дважды в этом случае.

Я переключился на эмулятор KitKat, и теперь все в порядке.

+0

Я sw чесался на Android 5.1 эмулятор с Android Studio 1.1.0, и теперь все в порядке. – Fuhrmanator

5

Автоматический перезапуск действий ожидается при многих обстоятельствах, включая поворот, изменение размера экрана, изменения локали и т. Д. Вы можете переопределить это поведение в манифесте.

Его дрянной способ делать вещи, но мы застряли с ним.

+0

Я пробовал с большинством возможных комбинаций изменений конфигурации: android: configChanges = "orientation | keyboardHidden | keyboard | layoutDirection | screenLayout | uiMode | touchscreen | fontScale | navigation», но такое же поведение :( – Omkar

+0

Одна уникальная вещь, которую я наблюдаю, когда активность перезапускается, я вижу следующие журналы: 12-21 15: 47: 02.512 1900-1916/chat.com.android_client W/EGL_emulation: eglSurfaceAttrib не реализован 12-21 15: 47: 02.512 1900-1916/chat.com.android_client W/OpenGLRenderer: Не удалось установить EGL_SWAP_BEHAVIOR на поверхности 0xa6da4140, error = EGL_SUCCESS – Omkar

+0

Несколько быстрых поисков этой строки не показывают ее проблемную проблему, но это может испортить графику. Что-то не так с эмулятором genymotion. –

Смежные вопросы