Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中的不同类调用非静态方法_Java_Android - Fatal编程技术网

从Java中的不同类调用非静态方法

从Java中的不同类调用非静态方法,java,android,Java,Android,我正在开发一款Android应用程序,但我遇到了一个似乎找不到答案的问题。我想从类“TaskHandler”中的方法“run”(因此从线程调用)调用类“MainActivity”中的方法“updateTime” 我在谷歌上搜索了大约一个小时的答案,访问了多个网站,找到了多个解决方案,其中non对我有用。我也在LinusTechTips和Corsair discord服务器中询问过这一点 主要活动类别: package thedutchmc.net.alarm; import andro

我正在开发一款Android应用程序,但我遇到了一个似乎找不到答案的问题。我想从类“TaskHandler”中的方法“run”(因此从线程调用)调用类“MainActivity”中的方法“updateTime”

我在谷歌上搜索了大约一个小时的答案,访问了多个网站,找到了多个解决方案,其中non对我有用。我也在LinusTechTips和Corsair discord服务器中询问过这一点

主要活动类别:

    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;
        }
    }

我希望有人能帮助我:)

您不能直接访问活动本身之外的活动方法。建议在组件之间进行通信的方法是使用

您确实可以直接访问活动,因为您可以从中实例化TaskHandler。您可以在TaskHandler的构造函数中传递活动(并将其保存为TaskHandler中的全局变量),但如果该活动在TaskHandler执行之前完成,则可能会导致崩溃

将上下文添加到TaskHandler的构造函数:

private Context context;

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

new TaskHandler(getApplicationContext());
您将能够发送一个广播,然后可以在活动中注册的BroadcastReceiver中接收该广播(有关BroadcastReceiver等的详细信息,请阅读链接)

Context
替换为
MainActivity
,将
getApplicationContext()
替换为
this
,您可以直接调用所需的方法,但这可能会导致崩溃,并且只有当TaskHandler仅在MainActivity内部使用时,此方法才会起作用

如果只在MainActivity内部使用,只需将其设置为内部类,然后就可以直接调用该方法,而无需任何引用

无论您做什么,您都不能自己创建活动类的新实例并期望它们工作。

使用广播。 在TaskHandler类中,从“run”方法内部发送广播:

Intent i = new Intent("run_method");
sendBroadcast(i);
在MainActivity类的onResume()中,注册广播接收器:

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()。删除静态的final MainActivity变量,如果TaskHandler在MainActivity中,则不需要它。切勿使用新操作员创建活动

您可能会遇到的另一件事是,您无法从后台线程更新UI,因此您可能希望在调用updateTime()或updateTime()内部时使用runOnUiThread(Runnable)