Android作业调度器API

Android作业调度器API,android,android-volley,android-jobscheduler,Android,Android Volley,Android Jobscheduler,我正在使用JobService中的截击向服务器发送请求。我的问题是,既然服务在主线程上运行,我应该在服务中创建一个单独的线程并在那里调用我的截取请求,还是简单地调用截取请求?这是我的一些代码 public class JobService extends android.app.job.JobService { static int count = 0; @Override public boolean onStartJob(final JobParameters jobParameters

我正在使用JobService中的截击向服务器发送请求。我的问题是,既然服务在主线程上运行,我应该在服务中创建一个单独的线程并在那里调用我的截取请求,还是简单地调用截取请求?这是我的一些代码

public class JobService extends android.app.job.JobService {

static int count = 0;

@Override
public boolean onStartJob(final JobParameters jobParameters) {

    Log.d("Job Service", "onStartJob " + count);
    final SharedPreferences prefs = getSharedPreferences(LOGIN_PREFS, MODE_PRIVATE);
    RequestQueue queue = Volley.newRequestQueue(this);
    StringRequest request = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d("Job Service", "onResponse");
            try {
                writeFileToCache(response);
                jobFinished(jobParameters, true);
            } catch (Exception e) {
                e.printStackTrace();
                jobFinished(jobParameters, true);
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("Volley error job", error.toString());
            jobFinished(jobParameters, true);
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            HashMap<String, String> params = new HashMap<>();
            params.put("regno", prefs.getString(REG_NO, ""));
            params.put("bdate", prefs.getString(DATE_OF_BIRTH, ""));
            return params;
        }
    };
    request.setRetryPolicy(new DefaultRetryPolicy(12000, 0, 0f));
    queue.add(request);
    return true;
}

private void writeFileToCache(String response) throws IOException {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
        return;
    }
    File file = new File(getExternalCacheDir() + CACHE_FILE);
    FileOutputStream fout = new FileOutputStream(file);
    Log.d("Writing to cache job", response);
    fout.write(response.getBytes());
    fout.close();
}

@Override
public boolean onStopJob(JobParameters jobParameters) {
    Log.d("Job Service", "onStopJob");
    return false;
}
公共类JobService扩展了android.app.job.JobService{
静态整数计数=0;
@凌驾
公共布尔onStartJob(最终JobParameters JobParameters){
Log.d(“作业服务”、“开始作业”+计数);
最终SharedPreferences=getSharedPreferences(登录优先,模式私有);
RequestQueue=Volley.newRequestQueue(this);
StringRequest=newStringRequest(request.Method.POST,URL,new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
Log.d(“作业服务”、“onResponse”);
试一试{
writeFileToCache(响应);
jobFinished(jobParameters,true);
}捕获(例外e){
e、 printStackTrace();
jobFinished(jobParameters,true);
}
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.d(“截击错误作业”,error.toString());
jobFinished(jobParameters,true);
}
}) {
@凌驾
受保护的映射getParams()引发AuthFailureError{
HashMap params=新的HashMap();
参数put(“regno”,prefs.getString(regu NO,”);
参数put(“bdate”,prefs.getString(出生日期“);
返回参数;
}
};
setRetryPolicy(新的DefaultRetryPolicy(12000,0,0f));
添加(请求);
返回true;
}
私有void writeFileToCache(字符串响应)引发IOException{
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.permission_DENIED){
返回;
}
File File=新文件(getExternalCacheDir()+缓存文件);
FileOutputStream fout=新的FileOutputStream(文件);
Log.d(“写入缓存作业”,响应);
write(response.getBytes());
fout.close();
}
@凌驾
公共布尔onStopJob(JobParameters JobParameters){
Log.d(“作业服务”、“onStopJob”);
返回false;
}

Volley本身是异步的;您不需要在这里分叉自己的线程。啊,但问题是,onResponse和onErrorResponse函数在主线程上运行。那么这不会阻止主线程吗?是的,但除非Volley为您提供了一种方法来提供自己的
活套
HandlerThread
或其他类似的东西g、 这是不可避免的。就个人而言,我不太使用Volley(我更喜欢OkHttp),因此我不记得Volley的API。如果您在
onResponse()
和/或
onErrorResponse()中有重要的工作需要做
,您可能需要在这些回调中分叉一个线程,或者安排在主应用程序线程之外完成该工作。我所做的只是将响应写入一个文件,所以我想我应该可以。理想情况下,不要在主应用程序线程上执行磁盘I/O。Volley本身是异步的;您不需要分叉自己的线程e、 啊,但问题是,onResponse和onErrorResponse函数在主线程上运行。那么这不会阻止主线程吗?是的,但除非Volley为您提供一种方法来提供自己的
活套
HandlerThread
或其他什么,这是不可避免的。就个人而言,我不太使用Volley(我更喜欢OkHttp)因此,我不记得Volley的API。如果您在
onResponse()
和/或
onErrorResponse()中有重要的工作需要完成
,您可能需要在这些回调中分叉一个线程,或者安排在主应用程序线程之外完成该工作。我所做的只是将响应写入一个文件,所以我想我应该没问题。理想情况下,不要在主应用程序线程上执行磁盘I/O。