2015-01-25 3 views
0

Я не знаю, что случилось с моим исходным кодом о Гнездо в Android, когда я использую методSocket.isConnected() сделать мое приложение для Android силы близко

.isConnected()

Мое приложение всегда принудительно закрывается. А вот мой исходный код

public class MyActivity extends Activity { 
    private String IP; 
    private int PORT; 
    private Socket socket; 
    private PrintWriter printWriter; 
    private TextView text; 

    private EditText fieldIp; 
    private EditText fieldPort; 


    private Button connect; 
    private FrameLayout frameIP; 

    private String message; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     frameIP = (FrameLayout)findViewById(R.id.frameIP); 
     connect = (Button)findViewById(R.id.connect); 
     fieldIp = (EditText)findViewById(R.id.ip); 
     fieldPort = (EditText)findViewById(R.id.port); 
     text = (TextView)findViewById(R.id.keterangan); 
     connect.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       IP = fieldIp.getText().toString(); 
       PORT = Integer.parseInt(fieldPort.getText().toString()); 
       SocketConnect socketConnect = new SocketConnect(IP,PORT); 
       socketConnect.execute(); 
      } 
     }); 
    } 


    private class SocketConnect extends AsyncTask<Void, Void, Boolean> { 

     String ip; 
     int port; 

     public SocketConnect(String a, int b){ 
      this.ip = a; 
      this.port = b; 
     } 


     @Override 
     protected Boolean doInBackground(Void... params) { 
      try { 
       socket = new Socket(); 
       socket.connect(new InetSocketAddress(ip,port)); 
       if(socket.isConnected()) 
       { 
        text.setText("Connected!"); 
       } 
       else 
       { 
        text.setText("Failed to connect!"); 
       } 
      } catch (IOException e) { 
       Log.e("MyActivity",e.getMessage()); 
      } 
      finally { 
       startActivity(new Intent(getApplicationContext(),ListViewText.class)); 
      } 
      return null; 
     } 
    } 
} 

И я использую это в AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

Я надеюсь, что вы можете помочь мне, ребята :(

+0

Можете ли вы опубликовать свой логарифм stacktrace? – ataulm

+0

Возможный дубликат [К сожалению, MyApp остановлен. Как я могу это решить?] (Http://stackoverflow.com/questions/23353173/unappro-myapp-has-stopped-how-can-i-solve-this) ... но довольно очевидно, что на самом деле , это еще один вопрос NOMTE. – Selvin

+2

@ Selvin: Нет. Это не проблема NOMTE. В коде OP нет ничего, что показывает какие-либо сетевые операции в основном потоке. На самом деле, наоборот - поток, выполняющий 'doInBackground', пытается изменить текст в« TextView ». – Squonk

ответ

1

Изменить метод doInBackground следующим образом ...

@Override 
protected Boolean doInBackground(Void... params) { 

    boolean success = true; 

    try { 
     socket = new Socket(); 
     socket.connect(new InetSocketAddress(ip, port)); 
    } catch (Exception e) { 
     success = false; 
     Log.e("MyActivity", e.getMessage()); 
    } 
    return success; 
} 

Затем добавьте способ onPostExecute ...

@Override 
protected void onPostExecute(boolean result) { 
    if(result) { 
     text.setText("Connected!"); 
     startActivity(new Intent(MyActivity.this, ListViewText.class)); 
    } 
    else { 
     text.setText("Failed to connect!"); 
    } 
} 
+1

Вызов 'isConnected()' здесь совершенно бессмысленен. Он не может вернуть false в тот момент, когда вы его вызываете. Вы только что назвали 'connect():' не было никакого исключения; * ergo * подключен. Если вы не введете обработчик исключений, настройте для отображения «успех»: если вы введете обработчик исключений, установите для отображения «сбой». – EJP

+0

@EJP: Действительная точка. Я признаю, что прошло некоторое время с тех пор, как я работал с «Sockets», и я просто работал с кодом OP. – Squonk

+0

Это работает ребята, спасибо @Squonk и всем, кто ответил на мой вопрос. У вас есть какой-нибудь блог в качестве моей ссылки на изучение сокета-андроида? – ginc0de

1

Первая вещь, которую вы вызываете операцию UI вне UI потоке (поэтому AsyncTask был создан, для обработки фоновых заданий только в doInBackground) Так что проблема об отображении текста ип TextView решается ...

Но что более важно:

Никогда не открывайте гнездо в AsyncTask. На Android developer site вы можете найти следующее:

Если вам нужно сохранить темы, работает в течение длительного периода времени, то настоятельно рекомендуется использовать различные интерфейсы, предоставляемые пакетом java.util.concurrent, такие как Палач, ThreadPoolExecutor и FutureTask.)

И это именно то, что вы хотите сделать. Поэтому используйте Service, Thread или упомянутые выше.

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