2012-12-02 73 views
0

我正在使用使用后台工作线程的Android应用程序。我需要能够将消息发送到活动的线程,但我无法弄清楚。Android线程和消息传递

我有一个活动,一个线程在后台工作。我想要启动线程并能够在需要时将消息(参数,对象等)发送给它。我已经掌握了从线程向活动发送消息的方式(通过将活动的处理程序传递给线程,并使用它发送消息),但每当我尝试将活动的消息发送到线程时,应用程序都会崩溃。

我试过了一个很好的10-12教程,我在网上找到了,所有这些教程似乎都有不同的做事方式,但我仍然没有得到它的正确工作。有人能指点我正确的方向吗?

一个例子简单的活动:

import android.os.Bundle; 
import android.app.Activity; 

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savesInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    private void doWork() { 
     Worker worker = new Worker(); 
     worker.start(); 

     worker.handler.sendEmptyMessage(0); 
    } 
} 

一个例子简单的线程:

import android.os.Handler; 
import android.os.Looper; 
import android.os.Message; 
import android.util.Log; 

public class Worker extends Thread { 
    public Handler handler; 

    public void run() { 
     Looper.prepare(); 

     handler = new Handler() { 
      public void handleMessage(Message msg) { 
       Log.d("Worker.run()", "Got message saying " + msg.what); 
      } 
     }; 

     Looper.loop(); 
    } 
+0

好教程http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/ – Mikhaili

+0

@Mikhaili我以前见过这个,这是一个很好的教程,但它根本不包括消息传递。 – tfrederick74656

回答

1

您必须阅读如何使用和对于是尺蠖第一,不要忘记在弯针停结束古德勒

public class Worker extends Thread { 
    public Handler handler; 
@Override 
public run() { 
    Looper.prepare(); 
//initialization will take a little time you if you want to send message check if handler != null 
    handler = new Handler() { 
     public void handleMessage(Message msg) { 
      Log.d("Worker.run()", "Got message saying " + msg.what); 
     } 
    }; 

    Looper.loop(); 
} 

public void sendMessage(Message m) 
{ 
    while(handler == null); 
    handler.sendMessages(m); 
} 
+0

谢谢!这解决了我的问题之一,另一个(我调用新的处理程序时,我一直得到一个NullPointerException)我简单地通过下面的问题解决http://stackoverflow.com/questions/2187464/how-do-i-ensure-another -threads处理程序 - 是 - 不是无效前,主叫它 – tfrederick74656