如何在AndroidUIThread中侦听传入事件
在阅读了大量的片段和教程之后,我仍然(甚至更)困惑于要走的路。我需要一个thread/backgroundtask,它侦听套接字上的传入事件,并向UIThread报告任何输入。首选的选择方式是什么?自己的线程还是多任务?将数据传输到主线程的最佳方式 谢谢你对这件事的任何想法 问候,, 马库斯 考虑到下面的答案,我尝试了以下方法: 主要活动:如何在AndroidUIThread中侦听传入事件,android,multithreading,communication,Android,Multithreading,Communication,在阅读了大量的片段和教程之后,我仍然(甚至更)困惑于要走的路。我需要一个thread/backgroundtask,它侦听套接字上的传入事件,并向UIThread报告任何输入。首选的选择方式是什么?自己的线程还是多任务?将数据传输到主线程的最佳方式 谢谢你对这件事的任何想法 问候,, 马库斯 考虑到下面的答案,我尝试了以下方法: 主要活动: public class MainActivity extends Activity { Handler handler = new Handler()
public class MainActivity extends Activity {
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
toastSomething();
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
threadstarter();
}
protected void threadstarter() {
super.onStart();
Thread backgroundthread = new Thread(new WorkerThread(handler));
backgroundthread.start();
}
public void toastSomething() {
Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
} }
我的runnable:
public class WorkerThread implements Runnable {
Handler messageHandler;
WorkerThread(Handler incomingHandler) {
messageHandler = incomingHandler;
}
public void run() {
while (true) {
for (int i = 0; i <= 100000; i++) {
// wait a moment
}
messageHandler.sendEmptyMessage(1);
}
} }
公共类WorkerThread实现可运行{
Handler消息处理程序;
WorkerThread(处理程序incomingHandler){
messageHandler=incomingHandler;
}
公开募捐{
while(true){
对于(inti=0;i而言,从后台与UIThread通信的唯一方法是
runOnUIThread(new Runnable {.// your ui stuff goes here.});
handler.post(new Runnable{.// your ui stuff goes here.});
我想不出别的了这两个在任何情况下都很方便
在ru中,您可以像这样从后台线程到UIThread进行通信
Runnable runnable = new Runnable()
{
@Override
public void run() {
for (int i = 0; i <= 10; i++) {
handler.post(new Runnable() {
@Override
public void run() {
progress.setProgress(value);
}
});
}
}
};
Runnable Runnable=new Runnable()
{
@凌驾
公开募捐{
对于(int i=0;i您可以使用AsyncTask
类,并在onPreExecute(…)
、onPostExecute(…)
或onProgressUpdate(…)
方法内的UI线程上发布
另一种方法是使用新线程进行后台工作,并将Runnable
发布到处理程序
如果在UI线程上实例化处理程序
,则发送给处理程序的所有内容都将在UI线程上运行。如果在后台线程上实例化处理程序,则发送给处理程序的所有内容都将在后台线程上运行。以下是代码,这是最后的工作:
UIThread:
public class MainActivity extends Activity {
public static final String LOG_TAG = "UIThread";
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
toastSomething();
//Log.v(LOG_TAG, "main thread");
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
threadstarter();
}
protected void threadstarter() {
super.onStart();
Thread backgroundthread = new Thread(new WorkerThread(handler));
backgroundthread.start();
}
public void toastSomething() {
Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
}
}
WorkerThread:
public class MainActivity extends Activity {
public static final String LOG_TAG = "UIThread";
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
toastSomething();
//Log.v(LOG_TAG, "main thread");
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
threadstarter();
}
protected void threadstarter() {
super.onStart();
Thread backgroundthread = new Thread(new WorkerThread(handler));
backgroundthread.start();
}
public void toastSomething() {
Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
}
}
HTH someone.Thanx to all作为输入。因此,如果新的runnable是一个单独的类,实现runnable接口,并且我的处理程序是在发布runnable的uithread中创建的,那么runnable如何向处理程序发布消息?+1表示@paradx的答案。SDK文件夹中有一些带有服务的示例,您可以尝试哼哼。您的复选框没有响应,因为messageHandler.sendEmptyMessage(1)
一直运行,并阻止UI线程。请尝试将for
循环替换为thread.sleep(5000)
就这样了。sry,但我仍然挂起。我想要一个单独的类,扩展runnable。在主活动中,我想要一个新的myrunnable,实例化一个新线程,并给它一个myrunnable。在这种情况下,处理程序是如何工作的,我仍然不明白。您应该将runnable作为匿名内部类或活动中的内部类,否则您将无法访问UI线程。或者您可以将处理程序作为Runnable构造函数中的参数,在mainAtivity中创建处理程序,并在实例化时将其传递给Runnable。
public class MainActivity extends Activity {
public static final String LOG_TAG = "UIThread";
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
toastSomething();
//Log.v(LOG_TAG, "main thread");
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
threadstarter();
}
protected void threadstarter() {
super.onStart();
Thread backgroundthread = new Thread(new WorkerThread(handler));
backgroundthread.start();
}
public void toastSomething() {
Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
}
}
public class MainActivity extends Activity {
public static final String LOG_TAG = "UIThread";
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
toastSomething();
//Log.v(LOG_TAG, "main thread");
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
threadstarter();
}
protected void threadstarter() {
super.onStart();
Thread backgroundthread = new Thread(new WorkerThread(handler));
backgroundthread.start();
}
public void toastSomething() {
Toast.makeText(this, "hello", Toast.LENGTH_SHORT).show();
}
}