【问题标题】:Java Thread CallBack in androidandroid中的Java线程回调
【发布时间】:2015-02-02 04:14:01
【问题描述】:

无论出于何种原因,我的回调都无法正常工作。本质上,我将使用我创建的 tcp 服务器进行群聊。我正在尝试在 java 中创建一个线程,然后使用回调将我从套接字获得的信息提供给主活动。

我目前收到的错误:

12-04 02:53:05.969  15143-15169/com.AndroidBabble E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-4340
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

但我不确定如何执行此 looper.prepare,并且当我执行此操作时,它似乎不起作用 - 所以我想知道您如何在我的代码上下文中实现 looper.prepare。

这是我的代码:

public interface ResponseEvent {
  public void responseEvent();
}    

主要

public class Main extends Activity implements ResponseEvent{
  Button btn;
  ClientTask client;
  String LOCALHOST = "localhost";
  int PORT = 5678;
  Thread thread;
  /**
   * Called when the activity is first created.
   */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btn = (Button) findViewById(R.id.button);
//    Thread thread = new Thread(client = new ClientTask(this, LOCALHOST, PORT));
    client = new ClientTask(this, LOCALHOST, PORT);

  }

  public void button(View v){
    thread = new Thread(client);
    thread.start();

  }

  public void responseEvent(){
    Toast.makeText(getBaseContext(), "Trig", Toast.LENGTH_LONG).show();
  }


}

客户端任务

public class ClientTask implements Runnable{
  public Handler mHandler;
  private ResponseEvent re;
  BufferedReader in;
  Socket socket;
  String HOSTNAME;
  int PORT;
  String scan;

  public ClientTask(ResponseEvent event, String HOSTNAME, int PORT){
    re = event;
    this.HOSTNAME = HOSTNAME;
    this.PORT = PORT;
  }

  public void run(){
 //   try {
  //    socket = new Socket(HOSTNAME, PORT);
   //   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

      re.responseEvent();
//    } catch (IOException ex) {
    }
  }

最终我想通过响应事件传递一个字符串,它会在 main 中获取它。

【问题讨论】:

  • 使用 Java interface 作为回调将是一个好的开始。

标签: java android callback


【解决方案1】:
 public void responseEvent(){
    Toast.makeText(getBaseContext(), "Trig", Toast.LENGTH_LONG).show();
  }

responseEvent 在你的线程上下文中被调用。但是Toast 必须由 UI 线程处理。由于responseEvent 是在 Activity 中定义的,因此您可以使用 runOnUiThread 在 UI 线程队列中发布 Runnable,

【讨论】:

    【解决方案2】:

    This 解释了如何使用回调接口,我认为这对你来说可能会很有趣。

    【讨论】:

    • 我已经读过了,我的代码中实现的大部分代码也出现在您链接的帖子中......
    【解决方案3】:

    您可以使用 Looper 从后台线程与 UI 线程进行通信。试试这个:

    public void responseEvent(){
        // Defines a Handler object that's attached to the UI thread
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getBaseContext(), "Trig", Toast.LENGTH_LONG).show();
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2018-02-15
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多