簡體   English   中英

從線程對象訪問MainActivity中的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM