私がAndroidを学び始めたとき、次のサンプルコードを使用してスレッド内のメッセージを処理するように書きましたlooper
:
public class MainActivity extends Activity {
Handler mHandler,childHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler(){
public void handleMessage(Message msg) {
TextView tv = (TextView) findViewById(R.id.displayMessage);
tv.setText(msg.obj.toString());
}
};
new LooperThread().start();
}
public void onSend(View v){
Message msg = childHandler.obtainMessage();
TextView tv = (TextView) findViewById(R.id.messageText);
msg.obj = tv.getText().toString();
childHandler.sendMessage(msg);
}
@Override
protected void onStart() {
super.onStart();
LooperThread ttTest = new LooperThread();
ttTest.start();
}
class LooperThread extends Thread {
final int MESSAGE_SEND = 1;
public void run() {
Looper.prepare();
childHandler = new Handler() {
public void handleMessage(Message msg) {
Message childMsg = mHandler.obtainMessage();
childMsg.obj = "child is sending "+(String)msg.obj;
mHandler.sendMessage(childMsg);
}
};
Looper.loop();
}
}
}
ボタンを押すとスレッドにメッセージを送信し、メインアクティビティに文字列を追加してスレッドが再度メッセージを送信するサンプルコードです。必要に応じてこのコードを操作できます。
アクティビティにはデフォルトでルーパーがあるため、アクティビティ用にルーパーを記述する必要はありません。
スレッドにはデフォルトでルーパーがないため、メッセージを格納するためのある種のキューであるルーパーを記述する必要があります。
アップデート:
XML コード
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/messageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Input message">
<requestFocus />
</EditText>
<TextView
android:id="@+id/displayMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</TextView>
<Button
android:id="@+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onSend"
android:text="Send" />
</LinearLayout>