如何将值从类传递到Activity - Android

时间:2016-01-25 14:23:16

标签: java android

我有关于课程/任务/活动的新手问题。我来自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 CODE UPDATE:

    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>

7 个答案:

答案 0 :(得分:4)

您可以使用Callback来实现此目的。

定义一些界面,如

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);

答案 1 :(得分:1)

在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级{

    public static String _utfValue =“”;

    void sendValue(){        _utfValue =“某些价值”;     }  }

在java类中获取此值,如:

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

答案 2 :(得分:1)

我正在按照@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-------");
   }
}

答案 3 :(得分:0)

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

您只需将处理程序从您的活动传递到您的类,在您的run方法中使用handler.sendMessage(“”),并分析您在活动中收到的内容。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

有很多方法可以实现以下一些

  1. 您可以按照其中一个答案中的说明使用界面
  2. 您可以创建一个IntentServce而不是您的类,并使用Result Receiver来传达数据。
  3. 您也可以使用处理程序和消息
  4. 您还可以创建服务并使用IBinders(绑定服务)
  5. 你可以谷歌更多地了解这些方法,并选择更适合你的方法

答案 6 :(得分:0)

你有A活动和B活动,当你在B活动方面完成动作时,当你回来时你需要它来实现A方。

  1. 创建一个y = x; 类和一个你需要输入的方法,让我们说吧;

    public interface SelectedBirthday {

    void onSelectedData(String date);

  2. }

    1. 现在我们在 B 方面,创建接口类的实例

      private SelectedBirthday mCallback;

    2. 覆盖

      @覆盖     public void onAttach(活动活动){         super.onAttach(活性);

      Instance
    3. 现在上传您需要的值

      String userBirth =(day +“”+ month +“”+ year);

      mCallback.onSelectedData(userBirth);

    4. 好的,我们转到 A

    5. 实施我们的接口类

          try {
              mCallback = (SelectedBirthday) activity;
          } catch (ClassCastException e) {
              Log.d("MyDialog", "Activity doesn't implement the ISelectedData interface");
          }
      }
      

      它会警告你它的方法,你实现了它

      implements SelectedBirthday