簡體   English   中英

從Java中的其他類調用非靜態方法

[英]Call a non static method from a different class in Java

我正在開發一個Android應用程序,但是遇到了一個我似乎找不到答案的問題。 我想從類“ TaskHandler”中的方法“運行”(因此從線程調用它)中調用類“ MainActivity”中的方法“ updateTime”。

我已經用Google搜索了大約一個小時的答案,訪問了多個網站並找到了多個解決方案,但這些解決方案都不適合我。 我還曾在LinusTechTips和Corsair不和諧服務器中詢問過此問題。

MainActivity類:

    package thedutchmc.net.alarm;

import android.os.Bundle;
import android.widget.EditText;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.time.LocalTime;


public class MainActivity extends AppCompatActivity {

    public static String alarmTime;
    public static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
    public static boolean alarmBool = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView mTextView = (TextView) findViewById(R.id.currentTime);

        mTextView.setText("Current Time: ");
        Main.scheduler.scheduleAtFixedRate(new TaskHandler(), 1, 1, TimeUnit.SECONDS);
    }

    public void onSubmit(View v){
        System.out.println("Submit!");
        EditText alarmTimeEditText = (EditText) findViewById(R.id.setAlarmTime);
        alarmTime = alarmTimeEditText.getText().toString();
        System.out.println("MainActivity (alarmTime): " + alarmTime);
        alarmBool = true;

    }

    public void updateTime() {
        TextView seeTime = (TextView) findViewById(R.id.currentTime);
        seeTime.setText(LocalTime.now().toString());
    }
}

TaskHandler類別:

package thedutchmc.net.alarm;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class TaskHandler implements Runnable {

    final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
    public static boolean isRinging = false;
    private String alarmTime;
    public static final MainActivity activity = new MainActivity();

    @Override
    public void run() {
        activity.updateTime();
        if (checkAlarmBool()) {
            System.out.println("Bool true! Alarm!");
            Main.alarm.set(false);
            Main.alarm.ringAlarm();
        }
    }

    boolean checkAlarmBool() {
        if (MainActivity.alarmBool && !isRinging) {
            String lTime = LocalTime.now().format(dtf);

            System.out.println("TaskHandler alarmTime: " + MainActivity.alarmTime);
            System.out.println("TaskHandler LocalTime: " + lTime);

            if(lTime.equalsIgnoreCase(MainActivity.alarmTime)) {
                isRinging = true;
                return true;
            } else {

                return false;
            }
        } else {
            return false;
        }
    }

我希望有一個人可以幫助我 :)

您不能直接在活動本身之外訪問活動的方法。 在組件之間進行通信的推薦方法是使用Broadcasts

您確實可以直接訪問Activity,因為您是從Activity實例化TaskHandler的。 您可以只在TaskHandler的構造函數中傳遞Activity(並將其保存為TaskHandler中的全局變量),但是如果該Activity在TaskHandler執行之前完成,則可能導致崩潰。

將上下文添加到TaskHandler的構造函數中:

private Context context;

public TaskHandler(Context context) {
    this.context = context;
}

並實例化TaskHandler

new TaskHandler(getApplicationContext());

並且您將能夠發送廣播,然后可以在您的Activity中注冊的BroadcastReceiver中接收廣播(請閱讀鏈接以獲取有關BroadcastReceivers等的詳細信息)。

MainActivity替換Context ,並使用this替換getApplicationContext() ,您可以直接調用所需的方法,但這會導致崩潰,並且僅當TaskHandler僅在MainActivity內使用時才有效。

如果僅在MainActivity內部使用它,則使其成為內部類,然后可以直接調用該方法,而無需任何引用。

無論您做什么,都無法自己創建Activity類的新實例並期望它們能正常工作。

使用廣播。 在您的TaskHandler類中,從“運行”方法內部發送廣播:

Intent i = new Intent("run_method");
sendBroadcast(i);

在您的MainActivity類的onResume()中,注冊Broadcast Receiver:

private BroadcastReceiver receiver;
if (receiver == null){
   receiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
            updateTime();
       }
   };
}
registerReceiver(receiver, new IntentFilter("run_method"));

使TaskHandler成為MainActivity內部的內部類。 然后,您將能夠調用updateTime()。 並刪除該靜態最終MainActivity變量,如果TaskHandler在MainActivity內部,則將不需要它。 切勿使用新操作員創建活動。

您可能會遇到的另一件事是,您無法從后台線程更新UI,因此您可能希望在調用updateTime()或在updateTime()內部使用runOnUiThread(Runnable)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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