2016-09-26 129 views
-2

我想要做的是調用放置在另一個子類的MainActivity.java文件中的方法。但每次我想調用這個方法,我的應用程序崩潰。從另一個類中調用MainActivity類中的方法

我已經試圖使SetGerateStat()靜態,但沒有改變任何東西。另外,我可以在沒有任何錯誤的情況下構建apk,當從線程調用SetGerateStat()時,應用程序只會崩潰。

我在這裏做錯了什麼?

我的代碼如下(請注意,這只是一個片段): MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
private CheckedTextView gerätestat; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  
} 

public void setGeraeteStat(boolean x) { 
    if (x==true) { 
     gerätestat.setCheckMarkDrawable(android.R.drawable.presence_online); 
    } else { 
     gerätestat.setCheckMarkDrawable(android.R.drawable.presence_busy); 
    } 
} 

public void onClick(View v) { 
    if(v==button_refresh) {    
     Thread connection = new Thread(new Conn("refresh", MainActivity.this)); 
     connection.start(); 
    } 
} 

Conn.java:

public class Conn implements Runnable { 
private MainActivity act; 
private String actioncommand; 

public Conn(String a) { 
    actioncommand = a; 
    act = null; 
} 

public Conn(String a, MainActivity m) { 
    actioncommand = a; 
    act = m; 
} 

public void run() { 
    switch(actioncommand) {    
     case "refresh": { 
      act.setGeraeteStat(true);      
     } 
     break; 
     } 
} 
+0

你不能這樣做從線程 –

+0

UI工作@PavneetSingh但實際上做UI的工作是位於在MainActivity文件,只是被從外部調用的方法。我在這裏瞭解錯誤嗎? –

+0

http://stackoverflow.com/questions/18821878/how-to-use-toast-message-inside-thread-in-android –

回答

0

你忘了初始化gerätestat?你必須在setcontentview之後初始化gerätestat。之後使用runOnUIThread方法如下

public void setGeraeteStat(final boolean x){ 
runOnUiThread (new Runnable() { 
    public void run() { 
     if (x==true) { 
      gerätestat.setCheckMarkDrawable(android.R.drawable.presence_online); 
     } else { 
     gerätestat.setCheckMarkDrawable(android.R.drawable.presence_busy); 
     } 
    } 
});} 
+0

gerätestat初始化。 我只是不知道我不得不使用runOnUiThread,我想我可以通過activitiy作爲參數。謝謝你的幫助 :) –

相關問題