我想更改Android中的UI。
我的主类创建第二个类,然后第二个类调用主类的方法。主类中的方法应更新UI,但程序在运行时会崩溃。
我该怎么办?
我的主要班级:
public class FileObserverActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1); tv.setText("new world"); MyFileObserver myFileObserver = new MyFileObserver("/sdcard/", this); myFileObserver.startWatching(); } String mySTR = ""; TextView tv ; public void event(String absolutePath,String path,int event) { mySTR = absolutePath+path+"\t"+event; tv.setText(mySTR); // program crash here! } }
还有我的第二堂课:
public class MyFileObserver extends FileObserver { public String absolutePath; FileObserverActivity fileobserveractivity; public MyFileObserver(String path,FileObserverActivity foa) { super(path, FileObserver.ALL_EVENTS); absolutePath = path; fileobserveractivity = foa; } @Override public void onEvent(int event, String path) { if (path == null) { return; } else if(event!=0) { fileobserveractivity.event(absolutePath, path, event); } else { return; } } }
您不能从主线程以外的线程调用UI方法。您应该使用Activity#runOnUiThread()方法。
public class FileObserverActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView) findViewById(R.id.textView1); tv.setText("new world"); MyFileObserver myFileObserver = new MyFileObserver("/sdcard/", this); myFileObserver.startWatching(); } String mySTR = ""; TextView tv ; public void event(String absolutePath,String path,int event) { runOnUiThread(action); } private Runnable action = new Runnable() { @Override public void run() { mySTR = absolutePath+path+"\t"+event; tv.setText(mySTR); } }; } public class MyFileObserver extends FileObserver { public String absolutePath; FileObserverActivity fileobserveractivity; public MyFileObserver(String path,FileObserverActivity foa) { super(path, FileObserver.ALL_EVENTS); absolutePath = path; fileobserveractivity = foa; } @Override public void onEvent(int event, String path) { if (path == null) { return; } else if(event!=0) { fileobserveractivity.event(absolutePath, path, event); } else { return; } } }