2016-09-16 69 views
0

我想調用一個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 –

回答

0
  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 –

相關問題