代码之家  ›  专栏  ›  技术社区  ›  Ranjit Vamadevan

getApplicationContext()不适用于使用AsyncTask for JobService的JobScheduler

  •  1
  • Ranjit Vamadevan  · 技术社区  · 7 年前

    JobScheduler AsyncTask 因为它 JobService . 在班上 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();
    }
    
    
    }
    

    下面是 MjobExecutor 扩展的类 工作服务 电话 MJ执行器 扩展的类

    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;
    }
    }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Nabin Bhandari    7 年前

    你不能打电话 getApplicationContext() 从内部 AsyncTask 因为这个方法是在 Context 异步任务 . 仅供参考,您可以从 Activity Service 或者它们的子类,因为这些类是

    为了解决你的问题,你需要通过考试 上下文 物体或物体 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;
        }
    
    }
    
        2
  •  0
  •   Ranjit Vamadevan    7 年前

        public class MJobExecuter extends AsyncTask<Void, Void, String> {
    
    private Context context;
    
    public YourTask(Context context) {
        this.context = context;
    }
    
    @Override
    protected String doInBackground(Void... voids) {
        // todo
        return null;
    }
    
        }
    

    然后在类MJobScheduler中,它扩展了调用AsyncTask的服务,应该传递上下文,如图所示。

        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(getApplicationonContext()){//pass context here..
    
        @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;
        }
        }
    
    推荐文章