[英]Accessing method in MainActivity from Thread-Object
在我的Android應用程序中,我有一個MainActivity類,該類啟動一個線程。 該線程執行填充並將其顯示在屏幕上。 (這部分正在工作)
我想從線程訪問MainActivity-Class中的方法。 但它不起作用...“無法解決方法”
這是我的代碼...
線程對象:
public class SensorProcessor implements Runnable {
protected Context mContext;
protected Activity mActivity;
private volatile boolean running = true;
//Tag for Logging
private final String LOG_TAG = SensorProcessor.class.getSimpleName();
public SensorProcessor(Context mContext, Activity mActivity){
this.mContext = mContext;
this.mActivity = mActivity;
}
public void run() {
while (running){
try {
final String raw = getSensorValue();
mActivity.runOnUiThread(new Runnable() {
public void run() {
//WORKS
final TextView textfield_sensor_value;
textfield_sensor_value = (TextView) mActivity.findViewById(R.id.text_sensor);
textfield_sensor_value.setText("Sensor Value: " + raw);
Log.v(LOG_TAG, raw);
//DOES NOT WORK, WHY?
mActivity.myMethod(); //Cannot resolve method
}
});
Thread.sleep(100);
} catch (InterruptedException e) {
//When an interrupt is called, we set running to false, so the thread can exit nicely
running = false;
}
}
Log.v(LOG_TAG, "Sensor Thread finished");
}
}
MainActivity類,正在調用線程:
public class MainActivity extends Activity implements OnClickListener, OnInitListener {
public void myMethod(){
//Do stuff...
}
//Start the Thread, when the button is clicked
public void onClick(View v) {
if (v.getId() == R.id.button_start) {
runnable = new SensorProcessor(this.getApplicationContext(),this);
thread = new Thread(runnable);
thread.start();
}
}
}
為什么使用mActivity.runOnUiThread(new Runnable()-方法)不起作用,如何正確完成?
最好的祝福
像((MainActivity)mActivity)
一樣使用MainActivity
鍵入您的mActivity
。 但是請確保您不應該從線程更新UI。
您需要使用Handler才能在線程和ui線程(您的活動)之間進行交互,所以這就是我的方法。
public class SensorProcessor implements Runnable {
protected Context mContext;
protected Handler handler;
private volatile boolean running = true;
//Tag for Logging
private final String LOG_TAG = SensorProcessor.class.getSimpleName();
// here I pass a handler instead of activity
public SensorProcessor(Context mContext, Handler handler){
this.mContext = mContext;
this.handler = handler;
}
// here is the key. Replace mActivity.myMethod(); with the following
handler.sendEmptyMessage(randomIntegerNumberWhatever);
...etc etc
然后制作一個類似dat的自定義處理程序
public class MessageHandler extends Handler
{
public interface IHandler
{
void myMethod();
}
private final IHandler activityHandler;
public MessageHandler(IHandler listener)
{
activityHandler = listener;
}
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
if (msg.what == randomIntegerNumberWhatever)
{
activityHandler.myMethod();
}
}
}
然后讓您的活動實現MessageHandler.IHandler接口。 可能看起來很復雜,但是請相信我
myMethod()
在基本Activity
類中不存在,因此強制轉換為(或提供) MainActivity
Activity
類不包含myMethod()
函數。 您需要將數據類型更改為具有以下功能的特定活動:
protected MainActivity mActivity;
public SensorProcessor(Context mContext, MainActivity mActivity){
this.mContext = mContext;
this.mActivity = mActivity;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.