簡體   English   中英

Android中的Java線程回調

[英]Java Thread CallBack in android

無論出於什么原因,我都無法使回調工作。 本質上,我將使用自己創建的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();
  }


}

ClientTask

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) {
    }
  }

最終,我想通過響應事件傳遞一個字符串,它將把它傳遞給主要對象。

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

在線程的上下文中調用responseEvent 但是Toast必須由UI線程處理。 由於responseEvent是在Activity中定義的,因此您可以使用runOnUiThread在UI Thread隊列中發布Runnable,

說明了如何使用回調接口,我認為這對您可能是一個有趣的閱讀。

您可以使用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();
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM