java - getApplicationContext() 不适用于使用 AsyncTask 进行 JobService 的 JobScheduler

标签 java android android-jobscheduler

我正在使用JobScheduler,它使用AsyncTask作为其JobService。在扩展AsyncTask的类MJobExecutor中,使用MediaPlayer,它需要getApplicationContext(),因为参数不起作用。它显示无法解析方法。

public class MJobExecutor extends AsyncTask<Void,Void,String> {
ValueExchange value;
MediaPlayer player;

@Override
protected String doInBackground(Void... params) {

    value = new ValueExchange();
    Calendar cal = Calendar.getInstance();
    Date date=cal.getTime();
    DateFormat dateFormat = new SimpleDateFormat("hh:mm a");
    String formattedDate=dateFormat.format(date);
    if(formattedDate.equals(value.getString())){

    }
    return "Long running task finishes." + value.getString();
}

private void play(){
    if(player == null){

        player = MediaPlayer.create(getApplicationContext(),R.raw.bensoundfunkyelement);
        //In the above code getApplicationContext() not working-
        //Cannot resolve method getApplicationContext()
        //i have used this as context not working.
        //getBaseActivity() not working.
        //getActivity().getApplicationContext() also not working.


      player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stopPlayer();
            }
        });
    }
    player.start();
}
private void stop(){
    stopPlayer();
}
private void stopPlayer(){
    if(player != null){
        player.release();
        player = null;
    }
}


}

下面是MainActivity 文件。该文件没有问题。

public class MainActivity extends AppCompatActivity {
private static final int JOB_ID = 101;
JobScheduler jobScheduler;
JobInfo jobInfo;



TextView textTime;
ImageButton ibLeft,ibRight,ibTop,ibBottom;
TextClock textClock;



String alarmTime = "12:00 AM";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    textTime = (TextView)findViewById(R.id.textView);
    ibLeft = (ImageButton)findViewById(R.id.left);
    ibRight = (ImageButton)findViewById(R.id.right);
    ibTop = (ImageButton)findViewById(R.id.top);
    ibBottom = (ImageButton)findViewById(R.id.bottom);

    textClock.setPadding(0,250,0,0);


    ComponentName componentName = new ComponentName(this,MJobScheduler.class);
    PersistableBundle bundle = new PersistableBundle();
    bundle.putString("alarmTime",alarmTime);

    JobInfo.Builder builder = new JobInfo.Builder(JOB_ID,componentName);

    builder.setExtras(bundle);
    builder.setPeriodic(5000);
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
    builder.setPersisted(true);
    jobInfo = builder.build();
    jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);



}


public void Start(View view) {

    jobScheduler.schedule(jobInfo);
    Toast.makeText(this,"Job Started...",Toast.LENGTH_LONG).show();
}

public void Stop(View view) {
    jobScheduler.cancel(JOB_ID);
    Toast.makeText(this,"Job Cancelled...",Toast.LENGTH_LONG).show();
}


}

下面是扩展JobServiceMjobExecutor类,调用扩展AsyncTaskMJobExecutor类。看来这个类也没有问题。

public class MJobScheduler extends JobService {
MJobExecutor mJobExecutor;
String alarmTime;
ValueExchange value;

@Override
public boolean onStartJob(final JobParameters params) {
    alarmTime = params.getExtras().getString("alarmTime");
    value = new ValueExchange();
    value.setString(alarmTime);
    mJobExecutor = new MJobExecutor(){

        @Override
        protected void onPostExecute(String s) {
            Toast.makeText(getApplicationContext(),alarmTime+" "+s,Toast.LENGTH_LONG).show();
            jobFinished(params,false);
        }
    };
    mJobExecutor.execute();
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    mJobExecutor.cancel(false);
    return false;
}
}

最佳答案

您无法从 AsyncTask 内部调用 getApplicationContext(),因为该方法是在 Context 类中定义的,而不是在 AsyncTask 类中定义的。仅供引用,您可以在 ActivityService 或其子类中使用此方法,因为这些类是 Context 的子类。

为了解决您的问题,您需要通过构造函数或 setter 在 AsyncTask 中传递 Context 对象或 MediaPlayer 对象。

例如:

public class YourTask extends AsyncTask<Void, Void, String> {

    private MediaPlayer player;

    public YourTask(MediaPlayer player) {
        this.player = player;
    }

    @Override
    protected String doInBackground(Void... voids) {
        // todo
        return null;
    }

}

关于java - getApplicationContext() 不适用于使用 AsyncTask 进行 JobService 的 JobScheduler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138434/

相关文章:

java - 扩展可序列化类的行为

java - TreeMap和ConcurrentSkipListMap什么时候排序?

android - Vuforia SDK Android Studio VS Vuforia Unity

java - 防止apk卸载后删除文件

android - 作业调度程序 API android L

android - 如何使用 JobScheduler 从后台应用程序获取步数

java - 在 Windows 服务器中运行可执行 jar

java - Quartz作业使用Javamail发送电子邮件,但Javamail是同步的

android - 学生×团体关联的稳定婚姻算法

android - SyncAdapter 与 JobScheduler