从另一个类调用Activity类的android widget方法?

问题描述:

我想调用一个Activity类的方法来正常的公共类。但它面临着NullPointerException从另一个类调用Activity类的android widget方法?

我Activty(Lv.class)

public class Lv extends Activity { 
     public static EditText et1; 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.listandimage); 
      et1 = (EditText) findViewById(R.id.editText1); 

我的公共类(Data.class)

 public class Data {    
      public String c = ""; 
      public String d = ""; 
      private static Socket soc; 

      public Data(String var1, String var2) { 
       this.c = var1.toLowerCase().trim(); 
       this.d = var2; 
      } 

    public final void start() { 

      try { 
       soc = new Socket(address, port); 
       os = soc.getOutputStream(); 
       is = new DataInputStream(soc.getInputStream()); 
      } catch (Exception var5) { 
      } 
    } 

     public void processdata(String rcvdata){ 
String txttype = rcvdata; 
     if (txttype.equals("\003")) { 
         String rname="my man"; 
         Lv.et1.setText(rname); 
    } 

MainActivity.class

button1.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     new RTask().execute(); 
    } 
}); 
class RTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... Void) { 
     try { 
      mee = new Data(editText1.getText().toString(), editText2 
        .getText().toString()); 
      mee.start(); 
     } catch (Exception e) { 
     } 
     return null; 
    } 

Data.class是一个公共类,用于合并从套接字连接接收的数据。 是的,我的布局名称,内容名称是好的,当我使用activity button onclick,它的工作原理。 不知何故,活动类

的每一个命令,通过这个公共类(例如gettext的,按钮点击,呼叫转接通知[使他们public static也]) 仍将NullPointerException异常

请帮我解决这个问题。

+0

你能提供更多的代码吗?例如你的Data类被初始化了吗? 由于您的et1变量是静态的,您的数据类实例可能只是在初始化之前访问该变量。你不应该对你的视图使用静态引用 - 以防止内存泄漏。 你应该在你的活动中调用一些方法来设置文本。我猜你的套接字连接数据是在工作线程上传递的,但是应该在UI线程上调用setText()方法(请参阅https://developer.android.com/reference/android/app/Activity.html#runOnUiThread (java.lang中。Runnable接口)) – convexHull

+0

**我猜你的套接字连接的数据是在工作线程交付,但setText()方法应该在UI线程调用** 是的,插座连接工作从MainActivity.class其中'数据线.class'是套接字类来调用一个套接字,它也不是一个UI线程。 :(@convexHull –

+0

所以我怎么从一个非活动类通过MainActivity.class的asynctask运行调用UI线程方法?? @convexHull –

  1. 你的情况,你不应该设置EditText静态
  2. 将此EditText传递给您的Data类。所以你可以在Data类中调用它。

    class Data { 
        //make it field 
        private EditText editText; 
        //your constructor of Data class 
        Data (EditText editText) { 
        this.editText = editText; 
        } 
        //now you can use editText like you are in Activity 
        private myMethod() { 
        editText.setText("every String you want to see here"); 
        } 
    } 
    

现在,当您创建活动数据刚及格的EditText

Data data = new Data(editText); 

同样的方式,你需要通过Activity

如果您需要在Data类中更改多个EditText,最好将活动传递给它。然后创建多个公共方法来更改视图的值。

首先你应该知道静态变量链接到,而不是对象。因此,在你的情况下,因为onCreate方法初始化EditText不是静态的,所以肯定它对你是空的。

+0

可以举个例子,我是怎么过'的EditText或Activity'通过我的'Data.class'?@DEADMC –

+0

@srabonshahadat,看看更新后 – DEADMC

+0

日但是有一些困惑,已经在'Lv(Activity.class)'上创建了'EditText',在数据接收过程中,当我的'Data.class'接收到我想要的特定数据时,我想改变'EditText 'Data.class'中'.setText'方法的值。 @DEADMC –