Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android处理程序:发送8条不同的消息:处理程序查找8条消息,但仅使用最后一条消息_Android_View_Handler_Message - Fatal编程技术网

Android处理程序:发送8条不同的消息:处理程序查找8条消息,但仅使用最后一条消息

Android处理程序:发送8条不同的消息:处理程序查找8条消息,但仅使用最后一条消息,android,view,handler,message,Android,View,Handler,Message,我是Android新手,发现要不断更新主视图,我必须创建一个线程来处理各种进程,然后将更新传递回主视图。我决定使用Handler类来实现这一点。本例中的视图有一个按钮来激活代码,还有一个tablelayout来显示接收到的消息,表示流程的一个阶段 问题是我发送了8条不同的消息,我可以在处理程序中看到8条消息返回,但所有8条消息的内容都与消息8相同 我希望处理程序按顺序接收消息 任何关于更好的方法的建议都欢迎学习 代码如下: ` } 此代码的结果如下所示: 试试这个 Message m = Mes

我是Android新手,发现要不断更新主视图,我必须创建一个线程来处理各种进程,然后将更新传递回主视图。我决定使用Handler类来实现这一点。本例中的视图有一个按钮来激活代码,还有一个tablelayout来显示接收到的消息,表示流程的一个阶段

问题是我发送了8条不同的消息,我可以在处理程序中看到8条消息返回,但所有8条消息的内容都与消息8相同

我希望处理程序按顺序接收消息

任何关于更好的方法的建议都欢迎学习

代码如下:

`

}

此代码的结果如下所示:

试试这个

Message m = Message.obtainMessage();
不是

试试这个

Message m = Message.obtainMessage();
不是


我怀疑可能发生的情况是,您不断修改名为messageString的相同引用字符串[],但从未创建新的引用字符串。通过引用传递,然后继续更改值,这可能是导致此结果的原因

有几件事,

  • 使用处理程序时,请尝试使用what字段作为返回代码。对于instance,您的OK字符串(如果它只是一个状态)最好定义int常量返回类型
  • 正如JanBo提到的,您不想扩展线程并实现Runnable
  • 这实际上取决于您正试图做什么,但是处理程序消息队列回调模式是您可以选择的许多模式之一,以实现您想要的。为了学习另一种方法,请看我写的一篇博客文章,其中解释了如何将UI外线程任务委托给IntentService,并在完成后调用您的活动

  • 我怀疑可能发生的情况是,您不断修改名为messageString的相同引用字符串[],但从未创建新的引用字符串。通过引用传递,然后继续更改值,这可能是导致此结果的原因

    有几件事,

  • 使用处理程序时,请尝试使用what字段作为返回代码。对于instance,您的OK字符串(如果它只是一个状态)最好定义int常量返回类型
  • 正如JanBo提到的,您不想扩展线程并实现Runnable
  • 这实际上取决于您正试图做什么,但是处理程序消息队列回调模式是您可以选择的许多模式之一,以实现您想要的。为了学习另一种方法,请看我写的一篇博客文章,其中解释了如何将UI外线程任务委托给IntentService,并在完成后调用您的活动

  • 我想发生的情况是:
    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();
    
    Does
    Log.e(“获得一条新消息,状态[0]+”:“+status[1]);
    给出正确的值?@vikram Log.e提供与视图相同的结果,即全部显示8!@JanBo-我从这里获得了此代码作为示例:我使用的示例是第三个失败的示例…所有帮助都值得欣赏。
    Log.e(“获得一条新消息,状态[0]+”:“+status[1]));
    给出正确的值?@vikram Log.e提供与视图相同的结果,即所有显示8!@JanBo-我从这里得到了此代码作为示例: