Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在AndroidUIThread中侦听传入事件_Android_Multithreading_Communication - Fatal编程技术网

如何在AndroidUIThread中侦听传入事件

如何在AndroidUIThread中侦听传入事件,android,multithreading,communication,Android,Multithreading,Communication,在阅读了大量的片段和教程之后,我仍然(甚至更)困惑于要走的路。我需要一个thread/backgroundtask,它侦听套接字上的传入事件,并向UIThread报告任何输入。首选的选择方式是什么?自己的线程还是多任务?将数据传输到主线程的最佳方式 谢谢你对这件事的任何想法 问候,, 马库斯 考虑到下面的答案,我尝试了以下方法: 主要活动: public class MainActivity extends Activity { Handler handler = new Handler()

在阅读了大量的片段和教程之后,我仍然(甚至更)困惑于要走的路。我需要一个thread/backgroundtask,它侦听套接字上的传入事件,并向UIThread报告任何输入。首选的选择方式是什么?自己的线程还是多任务?将数据传输到主线程的最佳方式

谢谢你对这件事的任何想法

问候,, 马库斯

考虑到下面的答案,我尝试了以下方法:

主要活动:

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();
    }
}