2011-06-22 77 views
2

如何在活动和线程之间发送消息(如果将线程放入类中)?线程(在类中)和活动之间的Android消息传递

好,这里是一个小更详细的代码:

public class AnActivity extends Activity implements OnClickListener, Callback 
{ 

    Button   b   = null; 
    TextView  t   = null; 
    MyThread  mThread  = null; 
    public Handler mainHandler = new Handler(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     b = (Button) findViewById(R.id.buttonSEND); 

     b.setOnClickListener(this); 
     mThread = new MyThread(this); 
     mThread.start(); 
    } 

    @Override 
    public void onClick(View v) 
    { 
     Message m = Message.obtain(); 
     m.what = 4; 
     mThread.myThreadHandler.sendMessage(m); 
    } 

    @Override 
    public boolean handleMessage(Message msg) 
    { 
     Toast.makeText(this, "What= " + Integer.toString(msg.what), Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
} 

下面的类是不AnActivity

public class MyThread extends Thread 
{ 
    public Handler myThreadHandler; 
    Activity mainActivity; 

    public MyThread (AnActivity anActivity) 
    { 
     this.mainActivity = anActivity;  
    } 


    @Override 
    public void run() 
    { 
     Looper.prepare(); 
     myThreadHandler = new Handler() 
     { 
      // sending back a message immediately after a received one 
      public void handleMessage(Message msg) 
      { 
       Message m = Message.obtain(); 
       m.what = 10; 
       // MY PROBLEM: 
       // mainActivity.mainHandler.sendMessage(m); // mainHandler is not visible 
       // mainActivity.sendMessage(m); // does not working 
      } 
     }; 
     Looper.loop(); 
    } 
} 

回答

1

这是我的活动:

public class AnActivity extends Activity implements OnClickListener, Callback 
{ 

    Button   b   = null; 
    TextView  t   = null; 
    MyThread  mThread  = null; 
    public Handler mainHandler = new Handler(this); 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     b = (Button) findViewById(R.id.buttonSEND); 

     b.setOnClickListener(this); 
     mThread = new MyThread(this); 
     mThread.start(); 
    } 


    @Override 
    public void onClick(View v) 
    { 
     Message m = Message.obtain(); 
     m.what = 4; 
     mThread.myThreadHandler.sendMessage(m); 
    } 


    @Override 
    public boolean handleMessage(Message msg) 
    { 
     Toast.makeText(this, "This is AnActivity. What=" + Integer.toString(msg.what), Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
} 

修饰螺纹: 在构造函数中我可以存储UI线程的MessageHandler。

public class MyThread extends Thread 
{ 
    public Handler myThreadHandler; 
    Activity  mainActivity; 
    Handler   mainHandler; 
    int    what = -1; 


    public MyThread (AnActivity anActivity) 
    { 
     this.mainActivity = anActivity; 
     this.mainHandler = anActivity.mainHandler; 
    } 


    @Override 
    public void run() 
    { 
     Looper.prepare(); 
     myThreadHandler = new Handler() 
     { 
      public void handleMessage(Message msg) 
      { 
       what = msg.what; 


       // Writing back to main UI thread 
       mainActivity.runOnUiThread(new Runnable() 
       { 

        @Override 
        public void run() 
        { 
         Toast.makeText(mainActivity, "This is MyThread. What=" + Integer.toString(what), Toast.LENGTH_SHORT).show(); 

        } 
       }); 

       Message m = Message.obtain(); 
       m.what = 10; 
       mainHandler.obtainMessage(12).sendToTarget(); 
      } 
     }; 
     Looper.loop(); 
    } 
} 
0

的一部分,我认为你正在寻找的“对话框”复选框从而你可以向用户显示警报消息,确认消息等。

欲了解更多信息,请参阅本:http://developer.android.com/reference/android/app/Dialog.html

这里就警告对话框一个很好的例子:http://www.androidpeople.com/android-alertdialog-example/

从您的注释代码:

AlertDialog.Builder alt_bld = new AlertDialog.Builder(this).create();  
alt_bld.setMessage("apprika target achieve..."); 
alt_bld.setCancelable(false); 
alt_bld.setPositiveButton("yes", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }); 
alt_bld.setNegativeButton("No", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.cancel(); } }); 
alert.show(); 

把这些代码在任何方法的任何只是传递参数调用。在正在运行的线程或活动中。

试试这个。

+0

谢谢,但这是一个不同的问题。 – TTSilver

0

您可以在类中创建一个构造函数,在该类中将为该活动提供实例。像这样:

public ConnectClass(Activity ac) { 
    activity = ac; 
} 

在这种情况下,您需要在名为activity的线程类中添加一个类变量。

+0

听起来不错。当我得到活动时,我如何从“活动”中获得消息? – TTSilver

+0

您可以在活动中创建一个方法,并使用以下代码从线程调用它:“activity.theMethodName(”也许是一个字符串?“);”或类似的东西。 – Manuel

+0

或者你可以在活动中做一个变量,并通过这样做来填充它:“activity.theVariable =”你需要的字符串“;”。 – Manuel