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

アクティビティのインスタンスを与えるクラスでコンストラクタを作成できます。このような場合は、アクティビティという名前のスレッドクラスにクラス変数を追加する必要があります。

+0

はいいですね。私が活動をしたとき、どうすれば "活動"からメッセージを得ることができますか? – TTSilver

+0

あなたはアクティビティでメソッドを作成し、スレッドから次のように呼び出すことができます: "activity.theMethodName("多分文字列? ");"またはそのようなものです。 – Manuel

+0

、またはアクティビティ内で変数を作成し、これを行うことで入力することができます: "activity.theVariable ="文字列uには ";"が必要です。 – Manuel

関連する問題