【问题标题】:How to pass values from a Class to Activity - Android如何将值从类传递到活动 - Android
【发布时间】:2021-03-25 23:03:50
【问题描述】:

我有一个关于类/任务/活动的新手问题。我来自 C,所以我不知道这是否是满足我需要的好方法。

我创建了一个类:

public class UDPServer {

    private MyDatagramReceiver myDatagramReceiver = null;

    private static int MAX_UDP_DATAGRAM_LEN = 1024;
    private static int UDP_SERVER_PORT = 5000;

    public void start() {
        myDatagramReceiver = new MyDatagramReceiver();
        myDatagramReceiver.start();
    }

    public void kill() {
        myDatagramReceiver.kill();
    }

    private class MyDatagramReceiver extends Thread {
        private boolean bKeepRunning = true;
        private String lastMessage = "";

        public void run() {
            String message;
            byte[] lmessage = new byte[MAX_UDP_DATAGRAM_LEN];
            DatagramPacket packet = new DatagramPacket(lmessage, lmessage.length);
            DatagramSocket socket = null;

            try
            {
                socket = new DatagramSocket(UDP_SERVER_PORT);

                while(bKeepRunning)
                {
                    socket.receive(packet);
                    message = new String(lmessage, 0, packet.getLength());
                    lastMessage = message;

                    //Here should call activity method

                });
                }

            }
            catch (Throwable e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (socket != null)
                {
                    socket.close();
                }
            }
        }

        public void kill() {
            bKeepRunning = false;
        }
    }
}

在我的活动中:

@Override
public void onResume() {
    super.onResume();

    mUDPServer = new UDPServer();
    mUDPServer.start();
}

@Override
public void onPause() {
    super.onPause();

    mUDPServer.kill();
}

现在,每次我收到一个数据包时,我都希望这个线程/类将收到的数据包传递给一个 Activity 方法,该方法详细说明(做一些计算或更新一些 UI ecc ..)这个传入的数据。但我不知道该怎么做,也许我的方法不正确。我可以在 Activity 中放置线程代码,但它似乎使代码的可读性降低。

建议怎么做?

@Anshul Jain 代码更新:

    public class Main_activity extends Activity implements Interface_UDPServer{
    TextView recived_message;

    UDPServer mUDPServer;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        recived_message = (TextView)findViewById(R.id.recived_message);
    }

    @Override
    public void onResume() {
        super.onResume();

        mUDPServer = new UDPServer(this);
        mUDPServer.start();
    }

    @Override
    public void onPause() {
        super.onPause();

        mUDPServer.kill();
    }

    public void sendData(final String str){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                recived_message.setText(str);
            }
        });
    }

}

XML 文件

<RelativeLayout 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" >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_below="@+id/linearLayout"
        android:layout_alignLeft="@+id/linearLayout"
        android:layout_alignStart="@+id/linearLayout">
    <TextView
        android:id="@+id/recived_message"
        android:layout_width="200dp"
        android:layout_height="35dp"
        android:textColor="#444444"
        android:textSize="20dp" />
    </LinearLayout>
</RelativeLayout>

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以为此目的使用回调。

    定义一些类似的接口

    public interface MyCustomInterface(){
        public void sendData(String str);
    }
    

    现在让你的 Activity 实现这个接口。

    public class MyActivity implements MyCustomInterface {
    
    @Override
    public void sendData(String str){
    
    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
      @Override
      public void run() {
        recived_message.setText(str);
      }
    });
    }
    }
    

    现在在UDPServer.java中,编写如下代码

    public class UDPServer {
    
    private MyCustomInterface interface;
    
    UDPServer(MyCustomInterface interface){
     this.interface = interface; 
    }
    
    }
    

    现在只要你有一些可用的数据,比如说一个字符串,你就可以像这样发送它

    interface.sendData(str);
    

    【讨论】:

    • 我试过你的代码并更正了这个:“public class MyCustomInterface(){”到“public interface MyCustomInterface(){”和这个“private MyCustomInterface interface;”到“私有 MyCustomInterface otherNameInterface;”因为 Android IDE 以接口名称为定义。
    • 还是不行,我已经调试过了,可以正确接收数据包并传输到Activity。但是当我运行一个示例“recived_message.setText(str);”时它不会更新我的 ViewText。还尝试了 runOnUiThread(new Runnable() { @Override public void run() { recived_message.setText(str); } });但什么都没有
    • 如果您能够获取有关 UI 活动的数据,那么没有理由不更新 Textview。你一定错过了什么。你能把你最新的代码吗?
    • 我已经更新了 sendData 函数中的代码,看看它是否有效
    • stackoverflow.com/questions/13974661/…。通过这个答案。如果您的问题得到解决,请接受答案。
    【解决方案2】:

    你有一个 A 活动和一个 B 活动,当你在 B 活动端完成操作时,你需要它在你回来时影响 A 端。

    1. 创建一个Instance 类和一个你输入你需要的方法,比如说;

      public interface SelectedBirthday {
      
          void onSelectedData(String date);
      }
      
    2. 现在我们在 B 方面,创建您的接口类的实例

      private SelectedBirthday mCallback;
      
    3. 覆盖

      @Override
      public void onAttach(Activity activity) {
          super.onAttach(activity);
      
          try {
              mCallback = (SelectedBirthday) activity;
          } catch (ClassCastException e) {
              Log.d("MyDialog", "Activity doesn't implement the ISelectedData interface");
          }
      }
      
    4. 现在上传你需要的值

      String userBirth = (day + " " + month + " " + year);
      
      mCallback.onSelectedData(userBirth);
      
    5. 好的,我们去A一侧

    实现我们的接口类

    implements SelectedBirthday
    

    它会警告你它的方法并且你实现了它

         @Override
            public void onSelectedData(String date) {
                if (!date.equals("")) {
                    txt_poup_age.setText(date);
    //now you are free to do what you want with the value you received automaticaly
                }
            }
    

    【讨论】:

      【解决方案3】:

      在 android 4 中执行此操作的选项

      • 在 android 中,您可以通过 Intent 或 Intent 后跟 Bundle.Like 发送数据 Intent i = new Intent(current_class.this, linked_class.class); i.putextra("Key", value);

      并在另一个类中获取值(假设字符串值):

       String value = getIntent.getExtra("String key which you used when send value");
      
      • 选项 2

        A类{

        公共静态字符串_utfValue = "";

        无效发送值(){ _utfValue = "某个值"; } }

      并在您的 java 类中获取此值,例如:

      String value = A._utfValue ;
      
      • 您可以使用 SharedPreference 来保存值并从其他类中获取。
      • 您可以使用带有一些返回值的静态方法,并通过类名在您的 java 类中获取该方法。

      【讨论】:

        【解决方案4】:

        我正在分享@Shadman Akhtar 建议的代码,并由@Singee 回复,这很有效。 单击按钮后,Textview 值将设置为您要从 retrivedata.java 发送到 MainActivity 的值。我已经使用 Button 来模拟可以在 retrivedata.java 中的异步方法

        MainActivity.java

        package com.example.interfacetesting;
        
        import androidx.appcompat.app.AppCompatActivity;
        
        import android.os.Bundle;
        import android.os.Handler;
        import android.os.Looper;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;
        
        public class MainActivity extends AppCompatActivity implements MyCustomInterface {
            TextView tv1;
            Button btn1;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                tv1=(TextView)findViewById(R.id.tv1);
                btn1=(Button)findViewById(R.id.btn1);
                btn1.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        retrivedata rd=new retrivedata(MainActivity.this);
                        rd.recievedataa();
                    }
                });
        
            }
        
            @Override
            public void sendData(String str){
        
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        tv1.setText(str);
                    }
                });
            }
        }
        

        MyCustomInterface.java //这是接口

        package com.example.interfacetesting;
        
        public interface MyCustomInterface{
            public void sendData(String str);
        }
        

        retrivedata.java //数据将从中发送到 MainActivity 的类。

        package com.example.interfacetesting;
        public class retrivedata{
        
            private MyCustomInterface otherNameInterface;
            retrivedata(MyCustomInterface otherNameInterface){
                this.otherNameInterface = otherNameInterface;
            }
           void recievedataa()
           {
               otherNameInterface.sendData("---any string you want to send to mainactivity-------");
           }
        }
        

        【讨论】:

          【解决方案5】:

          也许你可以使用一个处理程序,用一些数据加载它,然后从你的活动中读取这些数据。 Check more infos here 关于处理程序

          您只需将一个处理程序从您的活动传递给您的类,在您的运行方法中使用 handler.sendMessage(""),然后分析您在活动中收到的内容。

          【讨论】:

            【解决方案6】:

            在你的情况下,我会使用活动作为界面。该接口作为静态参数存储在 Application 类中。

            【讨论】:

              【解决方案7】:

              有很多方法可以实现这一点,以下是一些

              1. 您可以使用其中一个答案中解释的接口
              2. 您可以创建一个 IntentServce 而不是您的类,并使用 Result Receiver 来传递数据。
              3. 您也可以使用处理程序和消息
              4. 您还可以创建服务并使用 IBinders(绑定服务)

              您可以通过 Google 搜索更多关于这些方法的信息,然后选择更适合您的方法

              【讨论】:

                猜你喜欢
                • 2021-07-22
                • 1970-01-01
                • 2015-03-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-08
                • 2019-01-26
                相关资源
                最近更新 更多