Android处理程序:发送8条不同的消息:处理程序查找8条消息,但仅使用最后一条消息
我是Android新手,发现要不断更新主视图,我必须创建一个线程来处理各种进程,然后将更新传递回主视图。我决定使用Handler类来实现这一点。本例中的视图有一个按钮来激活代码,还有一个tablelayout来显示接收到的消息,表示流程的一个阶段 问题是我发送了8条不同的消息,我可以在处理程序中看到8条消息返回,但所有8条消息的内容都与消息8相同 我希望处理程序按顺序接收消息 任何关于更好的方法的建议都欢迎学习 代码如下: ` } 此代码的结果如下所示: 试试这个Android处理程序:发送8条不同的消息:处理程序查找8条消息,但仅使用最后一条消息,android,view,handler,message,Android,View,Handler,Message,我是Android新手,发现要不断更新主视图,我必须创建一个线程来处理各种进程,然后将更新传递回主视图。我决定使用Handler类来实现这一点。本例中的视图有一个按钮来激活代码,还有一个tablelayout来显示接收到的消息,表示流程的一个阶段 问题是我发送了8条不同的消息,我可以在处理程序中看到8条消息返回,但所有8条消息的内容都与消息8相同 我希望处理程序按顺序接收消息 任何关于更好的方法的建议都欢迎学习 代码如下: ` } 此代码的结果如下所示: 试试这个 Message m = Mes
Message m = Message.obtainMessage();
不是
试试这个
Message m = Message.obtainMessage();
不是
我怀疑可能发生的情况是,您不断修改名为messageString的相同引用字符串[],但从未创建新的引用字符串。通过引用传递,然后继续更改值,这可能是导致此结果的原因 有几件事,
我怀疑可能发生的情况是,您不断修改名为messageString的相同引用字符串[],但从未创建新的引用字符串。通过引用传递,然后继续更改值,这可能是导致此结果的原因 有几件事,
我想发生的情况是:
messageString
,您只创建了一次,它正在更新,而message
正在队列中等待。按如下方式更改代码:
String[] messageString1 = new String[2];
Message message = handler.obtainMessage();
messageString1[0]="OK";
messageString1[1]="Number 1";
message.obj = messageString1;
handler.sendMessage(message);
String[] messageString2 = new String[2];
message = handler.obtainMessage();
messageString2[0]="OK";
messageString2[1]= "Number 2";
message.obj = messageString2;
handler.sendMessage(message);
....
....
我想发生的情况是:
messageString
,您只创建了一次,它正在更新,而message
正在队列中等待。按如下方式更改代码:
String[] messageString1 = new String[2];
Message message = handler.obtainMessage();
messageString1[0]="OK";
messageString1[1]="Number 1";
message.obj = messageString1;
handler.sendMessage(message);
String[] messageString2 = new String[2];
message = handler.obtainMessage();
messageString2[0]="OK";
messageString2[1]= "Number 2";
message.obj = messageString2;
handler.sendMessage(message);
....
....
我不确定我是否在正确的地方这样做,但我想我会根据我在这里收到的帮助发回我的重构代码,这可能会帮助其他人。这对我来说效果很好,代码看起来很整洁,但是任何关于如何改进或提高效率的反馈都将不胜感激。如果我在错误的地方做这件事,也要让我知道
public class messageHandlerTest2 extends Activity {
protected TextView textView;
protected Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
createTableRow((mymessageObject) msg.obj);
}
}; //Set-up handler to be used later
Button btnStartProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button connectButton = (Button) findViewById(R.id.connectButton);
addListenerOnButton();
} // End of create
protected class connectWiFi extends Thread {
public void run() {
try {
sendMessage(true,"Number 1"); // send if OK and a stage message
sendMessage(true,"Number 2");
sendMessage(true,"Number 3");
sendMessage(true,"Number 4");
sendMessage(true,"Number 5");
sendMessage(true,"Number 6");
sendMessage(true,"Number 7");
sendMessage(true,"Number 8");
sendMessage(true,"Number 9");
sendMessage(true,"Number 10");
sendMessage(true,"Number 11");
sendMessage(true,"Number 12");
} catch (Exception e) {
e.printStackTrace();
Log.e("Exception found", "bugger");
}
}// End or run
}// End of class
public void addListenerOnButton() {
btnStartProgress = (Button) findViewById(R.id.connectButton);
btnStartProgress.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
connectWiFi connectwifi = new connectWiFi();
connectwifi.start();
}
});
}
private void createTableRow(mymessageObject stage) {
String statusString;
TableLayout tl = (TableLayout) findViewById(R.id.statusTable);
TableRow tr = new TableRow(this);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
tr.setLayoutParams(lp);
tr.setBackgroundColor(0xFFFFFFFF);
TextView tvStatus = new TextView(this);
tvStatus.setLayoutParams(lp);
tvStatus.setPadding(2, 1, 1, 2);
tvStatus.setTextColor(0xFF000000);
if (stage.Status) {statusString = "OK";} else {statusString = "No";};
tvStatus.setText(statusString); // Status
TextView tvStage = new TextView(this);
tvStage.setLayoutParams(lp);
tvStage.setPadding(2, 1, 1, 2);
tvStage.setTextColor(0xFF000000);
tvStage.setText(stage.statusMessage); // Stage
tr.addView(tvStatus);
tr.addView(tvStage);
tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private class mymessageObject { // Creates object of status flag and stage message
boolean Status;
String statusMessage;
mymessageObject(boolean newStatus, String newMessage){
Status = newStatus;
statusMessage = newMessage;
}
}
private void sendMessage (boolean status, String stageMessage) { // Handle sending message back to handler
Message message = handler.obtainMessage();
message.obj = new mymessageObject(status,stageMessage);
handler.sendMessage(message);
}
}我不确定我是否在正确的地方这样做,但我想我会根据我在这里收到的帮助发回我的重构代码,它可能会帮助其他人。这对我来说效果很好,代码看起来很整洁,但是任何关于如何改进或提高效率的反馈都将不胜感激。如果我在错误的地方做这件事,也要让我知道
public class messageHandlerTest2 extends Activity {
protected TextView textView;
protected Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
createTableRow((mymessageObject) msg.obj);
}
}; //Set-up handler to be used later
Button btnStartProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button connectButton = (Button) findViewById(R.id.connectButton);
addListenerOnButton();
} // End of create
protected class connectWiFi extends Thread {
public void run() {
try {
sendMessage(true,"Number 1"); // send if OK and a stage message
sendMessage(true,"Number 2");
sendMessage(true,"Number 3");
sendMessage(true,"Number 4");
sendMessage(true,"Number 5");
sendMessage(true,"Number 6");
sendMessage(true,"Number 7");
sendMessage(true,"Number 8");
sendMessage(true,"Number 9");
sendMessage(true,"Number 10");
sendMessage(true,"Number 11");
sendMessage(true,"Number 12");
} catch (Exception e) {
e.printStackTrace();
Log.e("Exception found", "bugger");
}
}// End or run
}// End of class
public void addListenerOnButton() {
btnStartProgress = (Button) findViewById(R.id.connectButton);
btnStartProgress.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
connectWiFi connectwifi = new connectWiFi();
connectwifi.start();
}
});
}
private void createTableRow(mymessageObject stage) {
String statusString;
TableLayout tl = (TableLayout) findViewById(R.id.statusTable);
TableRow tr = new TableRow(this);
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
tr.setLayoutParams(lp);
tr.setBackgroundColor(0xFFFFFFFF);
TextView tvStatus = new TextView(this);
tvStatus.setLayoutParams(lp);
tvStatus.setPadding(2, 1, 1, 2);
tvStatus.setTextColor(0xFF000000);
if (stage.Status) {statusString = "OK";} else {statusString = "No";};
tvStatus.setText(statusString); // Status
TextView tvStage = new TextView(this);
tvStage.setLayoutParams(lp);
tvStage.setPadding(2, 1, 1, 2);
tvStage.setTextColor(0xFF000000);
tvStage.setText(stage.statusMessage); // Stage
tr.addView(tvStatus);
tr.addView(tvStage);
tl.addView(tr, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private class mymessageObject { // Creates object of status flag and stage message
boolean Status;
String statusMessage;
mymessageObject(boolean newStatus, String newMessage){
Status = newStatus;
statusMessage = newMessage;
}
}
private void sendMessage (boolean status, String stageMessage) { // Handle sending message back to handler
Message message = handler.obtainMessage();
message.obj = new mymessageObject(status,stageMessage);
handler.sendMessage(message);
}
}要通过处理程序发送数据,您可以使用bundle作为要发送给处理程序的消息对象的数据。像这样的代码:
//在控制器处理程序的handleMessage方法中接收消息(例如,在UI线程上)
handler=新的handler(){
@凌驾
公共无效handleMessage(消息消息消息){
Bundle b=msg.getData();
整数值=b.getInt(“键”);
...
}
};
//在后台线程中发送消息
新线程(newrunnable()){
@凌驾
公开募捐{
最终消息消息消息=新消息();
最终捆绑包b=新捆绑包();
整数值=1;
b、 putInt(“键”,值);
msg.setData(b);
handler.sendMessage(msg);
}
).start();
要通过处理程序发送数据,您可以使用bundle作为要发送给处理程序的消息对象的数据。如下代码:
//在控制器处理程序的handleMessage方法中接收消息(例如,在UI线程上)
handler=新的handler(){
@凌驾
公共无效handleMessage(消息消息消息){
Bundle b=msg.getData();
整数值=b.getInt(“键”);
...
}
};
//在后台线程中发送消息
新线程(newrunnable()){
@凌驾
公开募捐{
最终消息消息消息=新消息();
最终捆绑包b=新捆绑包();
整数值=1;
b、 putInt(“键”,值);
msg.setData(b);
handler.sendMessage(msg);
}
).start();
DoesLog.e(“获得一条新消息,状态[0]+”:“+status[1]);
给出正确的值?@vikram Log.e提供与视图相同的结果,即全部显示8!@JanBo-我从这里获得了此代码作为示例:我使用的示例是第三个失败的示例…所有帮助都值得欣赏。Log.e(“获得一条新消息,状态[0]+”:“+status[1]));
给出正确的值?@vikram Log.e提供与视图相同的结果,即所有显示8!@JanBo-我从这里得到了此代码作为示例: