2014-12-21 3 views
0

저는 안드로이드 앱 개발에 초보자입니다. 최근에 채팅 앱을 개발하기 시작했습니다. 나는 클라이언트 서버 메시지 교환의 기본 기능을 달성했다. 안드로이드 활동이 자동으로 다시 시작되는 문제에 직면하고 있습니다. 이 때문에 새보기 인스턴스가 만들어지고 목록보기에서 메시지를 볼 수 없습니다.내 활동이 자동으로 다시 시작하는 이유는 무엇입니까?

추적에서 나는 활동이 중지되고 자동으로 생성 된 것을 볼 수 있습니다. 따라서 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> 

I 공동 동작을 확인하기 위해 connectToServer()에 대한 mmented 호출은 동일하지만 동일합니다. 따라서 connectToServer()로 인한 문제는 없습니다.

다음

내가이 응용 프로그램을 여기에 누락 될 수있는 것을 활동의 자동 다시 시작이 예상되지 않기 때문에 을 실행하는 안드로이드 스튜디오에서 사용하고있는 에뮬레이터입니다. 제발 제안 해주세요.

+0

자동 재시작을 방지하기보다는 인스턴스 상태 및 방어 코딩을 저장하여 자동 재시작을 조정하는 방법을 확인하십시오. 안드로이드는 당신을 위해'Bundle' 객체를 제공하며 최대한 많이 사용합니다. – initramfs

+0

엉덩이에 통증이 있고, 부러지기 쉽지 않습니다. 방어 적으로 코드를 해제하는 것이 실제로는 훨씬 안전합니다. 그러면 처음에는 위험한 상황에 빠지지 않습니다. 거의 모든 사소한 응용 프로그램이 기능을 끄는 이유가 있습니다. Google의 오픈 소스 앱도보십시오. –

+0

@GabeSechan 그들이이 디자인 패턴을 은퇴하게 될지 궁금합니다. 변경 가능성과 호환성 문제가 너무 커서 실현 가능성이 너무 높습니다. – initramfs

답변

1

예 Android 3.1 및 Ubuntu 14.04에서 Lollipop 용 에뮬레이터에 문제가 있습니다.)이 때문에에서 onCreate의

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 

(이 경우에 두 번 호출하기되었습니다 그것은 다음과 같은 오류를주고 있었다.

KitKat 에뮬레이터로 전환 했으므로 이제는 문제가 없습니다.

+0

I sw 안드로이드 스튜디오 1.1.0과 안드로이드 5.1 에뮬레이터에 가려져 지금은 괜찮습니다. – 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 : 서페이스 0xa6da4140에 EGL_SWAP_BEHAVIOR을 설정하지 못했습니다. 오류 = EGL_SUCCESS – Omkar

+0

문자열에 대한 몇 가지 빠른 검색 결과 충돌 문제가 아니지만 그래픽이 엉망이 될 수 있습니다 .GeymotionEmulator에 문제가 있습니다. –

관련 문제