【问题标题】:Toast.makeText is called only onceToast.makeText 只被调用一次
【发布时间】:2016-09-15 00:15:58
【问题描述】:

我遇到了一个问题,我无法解决。我正在尝试制作一个接收和发送消息的Android客户端(带有多线程,所以我不必等待发送消息的服务器,反之亦然)和一个为Windows编写的服务器几乎和 Android 客户端一样,接收和发送消息(这里也有多线程)。

final Thread t = new Thread(new Runnable() {
      @Override
      public void run() {
             Looper.prepare();
             try {
                   in_server = new BufferedReader(new InputStreamReader(client.getInputStream())); //receive from server
                   //Log.i("Message from server", in_server.readLine());
                   Toast.makeText(MainActivity.this, in_server.readLine(), Toast.LENGTH_SHORT).show();
             } catch (IOException e) {
                   Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
             }
             Looper.loop();
      }
});

如果我写了一个 while(true) 而不是两个 looper 并且我使用了“Log.i”,我会收到从服务器发送的所有消息,客户端和服务器可以完美地工作。但是,如果我删除“Log.i”并使用“Toast.makeText”并放置两个 Loopers,就像上面的代码一样,我会收到我从服务器发送的第一条消息,其他的则不会收到。我不知道如何解决这个问题。

请不要无礼,我是 Java 新手,我只是在做一些测试,但为此浪费了一个多小时。

【问题讨论】:

  • 这可能看起来很傻,但是每次的信息都是一样的吗?如果是这样,那么当实际运行多次时,Toast 似乎只运行一次。如果消息每次都不一样,那我不知道……那是一种很奇怪的行为。
  • 我从服务器发送了类似“hi”的信息,在“hello”之后,我只收到了“hi”作为 Toast。如果我在一段时间内使用 Log.i(真),我会在 LogCat 上同时获得“hi”和“hello”。无法解决问题。

标签: java android server client toast


【解决方案1】:

Toast 等到现有的 Toast 完成显示后才会出现。如果您有一个循环不断地以循环速度发送短信,那么积压会变得很长,以至于不同的消息可能需要很长时间才能显示出来。

我建议作为一种解决方案,检查是否有更新的消息,如果有,则仅显示,而不是每次都显示。

【讨论】:

  • 我尝试使用“runOnUiThread”。它阻止了我的 Android 手机,但是当我停止服务器时,我可以看到所有消息相继出现“你好”“如何”“是”“你”。如果我能在不阻塞手机的情况下让 runOnUiThread 工作,我就能解决我的问题。
  • 刚刚解决了,还是谢谢你 :) 我解决了制作一个“public void makeToast(final String s)”并在我的“receiver thread”中调用它
猜你喜欢
  • 2021-01-04
  • 2019-08-23
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多