[英]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.