2011-06-22 80 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