2013-12-19 3 views
-2

Я новичок в android. Мой проект связан с сетью. Я получаю эту ошибку к неустранимым: главныйНеустранимая исключение в основной теме

android.os.NetworkOnMainThreadException 
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java1133) 

... ...

Мой код:

package com.example.simpleclientactivity; 
    import java.io.IOException; 
    import java.io.PrintWriter; 
    import java.net.Socket; 
    import java.net.UnknownHostException; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.Toast; 

    public class SimpleClientActivity extends Activity { 

    private Socket client; 
    private PrintWriter printwriter; 
    private EditText textField1; 
    private Button button; 
    private String messsage; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     textField1 = (EditText) findViewById(R.id.editText1); //reference to the text field 
     button = (Button) findViewById(R.id.button1); //reference to the send button 

     //Button press event listener 
     button.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 

      Context context = getApplicationContext(); 
      CharSequence text = "Hello toast!"; 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
      messsage = textField1.getText().toString(); //get the text message on the text field  
      textField1.setText("");  //Reset the text field to blank 

      try { 

       client = new Socket("10.0.2.2", 4444); //connect to server 
       printwriter = new PrintWriter(client.getOutputStream(),true); 
       printwriter.write(messsage); //write the message to output stream 

       printwriter.flush(); 
       printwriter.close(); 
       client.close(); //closing the connection 

       } catch (UnknownHostException e) { 
       e.printStackTrace(); 
       } catch (IOException e) { 
       e.printStackTrace(); 
       } 
     } 
     }); 

    } 
    } 

Вот main.xml код

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"`enter code here` 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="83dp" 
     android:ems="10" 
     android:text="Client" > 

     <requestFocus /> 
    </EditText> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/editText1" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="53dp" 
     android:text="Send" /> 

</RelativeLayout> 

Это даже не сообщение тоста после нажатия кнопки. Однако он показывает ошибку в android.os.NetworkOnMainThreadException.

+1

Вы не можете подключиться к Интернету в потоке 'UI', используйте класс' AsyncTask' –

+0

Переместите код сокета в поток или асинтез. – Raghunandan

+1

потребовалось бы меньше времени, чтобы найти ответ для этого, чтобы опубликовать этот вопрос ... – Vikram

ответ

1

Попробуйте это ..

Это исключение, когда приложение пытается выполнить операцию сети на своем главном потоке

button.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 

      Context context = getApplicationContext(); 
      CharSequence text = "Hello toast!"; 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
      messsage = textField1.getText().toString(); //get the text message on the text field  
      textField1.setText("");  //Reset the text field to blank 

      new MyClass().execute(messsage); 


     } 
     }); 

MyClass.classAsyncTask

class MyClass extends AsyncTask<String, Void, String> { 

    private Exception exception; 

    protected String doInBackground(String... messsage) { 
     try { 

       client = new Socket("10.0.2.2", 4444); //connect to server 
       printwriter = new PrintWriter(client.getOutputStream(),true); 
       printwriter.write(messsage); //write the message to output stream 

       printwriter.flush(); 
       printwriter.close(); 
       client.close(); //closing the connection 

       } catch (UnknownHostException e) { 
       e.printStackTrace(); 
       } catch (IOException e) { 
       e.printStackTrace(); 
       } 
    } 

    protected void onPostExecute(String result) { 
     // TODO: check this.exception 
     // TODO: do something with the feed 
    } 
} 

Вы не можете выполнить сетевое IO в потоке пользовательского интерфейса на соте. Технически это есть, возможно, в более ранних версиях Android, но это действительно плохая идея, так как это приведет к тому, что ваше приложение перестанет отвечать на запросы и может привести к тому, что ОС будет убивать ваше приложение за плохое поведение. Вам нужно будет запустить фоновый процесс или использовать AsyncTask для выполнения сетевой транзакции в фоновом потоке.

На сайте разработчика Android есть статья о Painless Threading, что является хорошим знакомством с этим и предоставит вам гораздо более глубокую глубину ответа, чем это можно реально представить здесь.

0

Вы должны поместить свой код, имеющий доступ к Интернету на нитке

new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
    //your code that access internet here 
    } 
}).start(); 
0

попробовать этот код

package com.example.simpleclientactivity; 
    import java.io.IOException; 
    import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class SimpleClientActivity extends Activity { 

private Socket client; 
private PrintWriter printwriter; 
private EditText textField1; 
private Button button; 
private String messsage; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    textField1 = (EditText) findViewById(R.id.editText1); //reference to the text field 
    button = (Button) findViewById(R.id.button1); //reference to the send button 

    //Button press event listener 
    button.setOnClickListener(new View.OnClickListener() { 

    public void onClick(View v) { 

     Context context = getApplicationContext(); 
     CharSequence text = "Hello toast!"; 
     int duration = Toast.LENGTH_SHORT; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 
     messsage = textField1.getText().toString(); //get the text message on the text field  
     textField1.setText("");  //Reset the text field to blank 

    new GetCategory().execute(message); 
    } 
    }); 

} 


    //add inner class 

    class GetCategory extends AsyncTask<Void, Void, ArrayList<AbstractDetail>>{ 



    protected ArrayList<AbstractDetail> doInBackground(String... messsage) { 
     try { 

      client = new Socket("10.0.2.2", 4444); //connect to server 
      printwriter = new PrintWriter(client.getOutputStream(),true); 
      printwriter.write(messsage); //write the message to output stream 

      printwriter.flush(); 
      printwriter.close(); 
      client.close(); //closing the connection 

      } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     return null; 

    } 

    protected void onPostExecute(ArrayList<AbstractDetail> result) 
    { 


     } 

    } 


} 






} 
0

Problem

  • Вы не можете получить доступ к сети через UI потока. Вы обращаетесь к сети через UI поток, поэтому вы получаете NetworkOnMainThreadException.

Решение

  • Создать новую нить и доступ к сети через эту Thread. ИЛИ
  • Использование AsyncTask сделать сетевую работу, связанным с doInBackgroung() и для обновления UI onPostExecute().
Смежные вопросы