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