2013-04-29 3 views
1

Я хочу отобразить сообщение, когда получены данные от клиента. Я запустил сервер и клиент. Клиент отправляет и получает подтверждение от сервера, но на стороне сервера android не было отображено никакого сообщения, а приложение разбилось, и здесь я вставляю то, что я получил от log cat. , а также внутренний класс, когда я хочу, чтобы показать сообщение:не отображает сообщение тоста android

import android.widget.Toast; 

class Handler implements Runnable { 
    private Context myContext; 

    private static final String TAG = "myLogs"; 

    public Handler(Socket client) { 
     this.client = client; 
    } 
    public Handler(final Context context) { 
     this.myContext= context; 
    } 

    public void run() { 
     try { 
      //message received.. 

      Toast.makeText(myContext.getApplicationContext(), "msg msg", Toast.LENGTH_SHORT).show(); 
      Log.d(TAG, "received...."); 
     } catch (IOException e) { 
      System.out.println("Errore: " + e); 
     } 
    } 
} 

LogCat

04-29 17:21:53.679: D/My log(19533): waiting for connnections 
    04-29 17:24:13.726: D/My Log(19533): Connected  04-29 
    17:24:14.859:W/dalvikvm(19533): threadid=9: thread exiting with uncaught exception (group=0x40018578)  04-29 17:24:14.859: E/AndroidRuntime(19533): FATAL EXCEPTION: Thread-10 04-29 
    17:24:14.859: E/AndroidRuntime(19533): java.lang.NullPointerException  04-29 
    17:24:14.859:E/AndroidRuntime(19533): at com.example.tcpserver.Handler.run(Handler.java:49)  04-29 
    17:24:14.859: E/AndroidRuntime(19533): at java.lang.Thread.run(Thread.java:1019) 
+0

незавершенные размещен код не имеет никакого смысла ... загрузить еще немного ... – waqaslam

+1

Вы не можете показать Тост за пределами потока пользовательского интерфейса –

ответ

0

После просмотра более полный код, то очевидно, что дизайн этого класса имеет некоторые основные вопросы. Наиболее очевидным является то, что он имеет два конструктора, которые принимают в разных Объектах, и игнорируют другие. Таким образом, будет либо сокет null, либо контекст null.

Во-вторых, как я опубликовал в своем другом ответе, есть некоторые недостатки в том, как показано тост.

Я предлагаю внести некоторые основные изменения в этот класс. Для начала, снимите конструкторы и добавьте вместо этого:

public Handler(Activity context, Socket client) { 
    this.client = client; 
    this.myContext= context; 
} 

Теперь вы можете построить один экземпляр и не беспокоиться о том, нулевые объекты.Это также навязывает вам построить это с Activity контексте - так что вы можете вызвать метод unOnUiThread, так что теперь вы можете позвонить:

((Activity) myContext).runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(myContext, "msg msg", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

thx, много, но я снова получил ошибку 04-29 20: 42: 34.640: E/AndroidRuntime (23347): FATAL EXCEPTION: Thread-10 04-29 20: 42: 34.640: E/AndroidRuntime (23347): java.lang.NullPointerException 04-29 20: 42: 34.640: E/AndroidRuntime (23347): \t at com.example.tcpserver.Handler.run (Handler.java:54) 04-29 20: 42: 34.640: E/AndroidRuntime (23347): \t at java.lang.Thread.run (Thread.java:1019), это эта строка ((Activity) myContext) .runOnUiThread (new Runnable() { – chajka

+0

, если я хочу, я могу отправить весь код чтобы увидеть полное изображение – chajka

+0

@chajka, рад, что я мог бы помочь. Что касается ошибки - вы можете много отлаживать с помощью операторов печати. ​​Добавьте это в свой конструктор: «Log.d (« Обработчик »,« Контекст ») + контекст == null? "null. Socket is": "not null. Socket is" + socket == null? "null.": "not null."; 'Yo Вы также можете попробовать пошаговую отладку, добавив * точку останова * к этой строке кода. [Подробнее об отладке] (http://stackoverflow.com/questions/8551818/how-to-debug-android-application-line-by-line-using-eclipse) – Phil

0

Вы не можете показать тост внутри нити, которая не является основной GUI поток.

Кажется, что вы выбрали «Обработчик» в качестве имени для класса, который вы пишете. Вы должны использовать android.os.Handler, чтобы сделать это внутри потока графического интерфейса, а не от вашего.

Кроме того, кажется, что вы получаете исключение NullPointerException в своем коде. Можете ли вы рассказать нам, на какой линии это происходит? (Изменить: какая строка «Handler.java:49» в вашем коде)

+0

да , обработчик это класс, я пишу его (полностью у меня есть 3 класса, основной, сервер и обработчик), может у вас привести пример, потому что я не понимаю, что такое поток графического интерфейса. Я не уверен, что знаю, в каком Я получил его, где я могу его проверить? – chajka

+0

Он говорит, что строка Handler.java 49. – marcantonio

+1

Чтение http://developer.android.com/guide/components/processes-and-threads.html и http://stackoverflow.com/questions/3652560/what-is-the -android-uithread-ui-thread должен быть очень полезным (обязательно) –

0

Вы можете отображать только тосты из нити пользовательского интерфейса. Попытка его из другого потока вызовет сбой. Посмотрите на Handlers, Handler.Callbacks и Messages.

НТН, Марк

2

Есть две вещи неправильно с вашим кодом. Первый, как утверждают другие, заключается в том, что вы вызываете команду из потока non-ui. Хотя это не очевидно из вашего кода, logcat предполагает, что вы вызываете это из потока non-ui. Чтобы показать сообщение Toast, вам необходимо убедиться, что вы вызываете тост из потока пользовательского интерфейса.

Другая проблема заключается в том, что вы пытаетесь показать Toast с использованием Контекст. Это не удастся, так как контекст приложения не может обновить пользовательский интерфейс. Просто используйте Контекст.

Ваш призыв к созданию Toast должен быть изменен, чтобы выглядеть следующим образом:

myContext.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(myContext, "msg msg", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

этот класс реализует Runnable (класс Handler реализует Runnable {), и я вызываю его внутри run(), поэтому я в нити ui или нет? я запутался. – chajka

+0

@chajka. Вам нужно поместить этот блок кода в свой метод 'run()'. Класс 'Handler' работает в отдельном потоке. 'run' переопределяется всеми классами, которые« реализуют Runnable »или« расширяют Thread », поэтому вы увидите это много в разработке. – Phil

+0

может я поместить его после публичного ничтожного пробега() { Ьгу {// отсылает // получить // здесь – chajka

0

У меня была такая же проблема. Когда я ссылаться код на поток пользовательского интерфейса проблема решена для меня

public void showToastMessage(final String msg) { 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_LONG).show(); 
     } 
Смежные вопросы