如何将asyncTask更改为服务? [英] How I can change my asyncTask into service?
问题描述
如何将我的asyncTask更改为服务,因为每次我关闭应用程序或重新启动设备时aysncTask都无法正常工作. 我有一个aysnc,它将Post请求发送到php服务器,我在每个请求上都返回了一个图像,因此我向用户设置了设置选项,他可以选择墙纸的图片以每1、5、10,...更改.分钟,但就像我说的那样,我想成为一名服务人员,因此,当用户选择更改墙纸的时间并关闭(销毁)应用程序时,服务器仍然会考虑更改,这是我的代码
How is it possible to change my asyncTask into service because everytime i close the app or the restart the device my aysncTask not working . I have aysnc that sends Post request to php server and i got back an image on every request so i putted setting option to the user he can choose to the picture of wallpaper to change on every 1,5,10,..... min but like i said i want to be service so when the user choose the timing to change the wallpaper and closes (destroy) the application the server still countinue to change here is my code
public class MainActivity extends AppCompatActivity {
TextView txt;
Button btn;
String forecastJsonStr;
RadioButton rd1, rd2, rd3, rd4, rd5, rd6, rd7;
Handler mHandler;
RadioGroup radioGroup;
private final static int INTERVAL = 1000*60 * 1; //1 min
private final static int INTERVAL2 = 1000*60*5; // 5 min
private final static int INTERVAL3 = 1000 * 60 * 10; // 10 min
private final static int INTERVAL4 = 1000 * 60 * 15; // 15 min
private final static int INTERVAL5 = 1000 * 60 * 30; // 30 min
private final static int INTERVAL6 = 1000 * 60 * 60; // 1 hour
private final static int INTERVAL7 = 1000 * 60 * 1440; // 1 day
private final String hostName = "http://555.555.555.555";
private final String hostRequestName = "/yay.php";
private final String hostWallpaperName = "/wallpaper/";
private static int SELECTED_INTERVAL = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView) findViewById(R.id.textView);
rd1 = (RadioButton) findViewById(R.id.radioButton);
rd2 = (RadioButton) findViewById(R.id.radioButton2);
rd3 = (RadioButton) findViewById(R.id.radioButton3);
rd4 = (RadioButton) findViewById(R.id.radioButton4);
rd5 = (RadioButton) findViewById(R.id.radioButton5);
rd6 = (RadioButton) findViewById(R.id.radioButton6);
rd7 = (RadioButton) findViewById(R.id.radioButton7);
radioGroup = (RadioGroup) findViewById(R.id.radiogroup);
mHandler = new Handler();
btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(rd1.isChecked()) {
SELECTED_INTERVAL = INTERVAL;
} else if (rd2.isChecked()) {
SELECTED_INTERVAL = INTERVAL2;
}
startRepeatingTask();
}
});
}
void startRepeatingTask() {
mHandlerTask.run();
}
Runnable mHandlerTask = new Runnable() {
@Override
public void run() {
new WallpaperData().execute();
mHandler.postDelayed(mHandlerTask, SELECTED_INTERVAL);
}
};
private class WallpaperData extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
try {
URL url = new URL("http://555.555.555.555/yay.php");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();
DataOutputStream wr = new DataOutputStream(
urlConnection.getOutputStream());
wr.write("method=get_random_wallpaper".getBytes());
wr.flush();
wr.close();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null) {
return null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
Log.d("hey", buffer.toString());
}
if (buffer.length() == 0) {
return null;
}
forecastJsonStr = buffer.toString();
return forecastJsonStr;
} catch (IOException e) {
Log.e("PlaceholderFragment", "Error ", e);
return null;
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
e.printStackTrace();
}
}
}
}
@Override
protected void onPostExecute(final String forecastJsonStr) {
txt.setText(forecastJsonStr);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext());
try {
Bitmap result = Picasso.with(getBaseContext())
.load(hostName + hostWallpaperName + forecastJsonStr)
.get();
wallpaperManager.setBitmap(result);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
thread.start();
super.onPostExecute(forecastJsonStr);
}
}
}
推荐答案
对于大于30秒的时间间隔,应使用AlarmManager而不是Handler的.postDelayed方法.请参阅以下教程: https://developer.android.com/training/scheduling/alarms.html , http://code4reference.com/2012/07/tutorial -on-android-alarmmanager/.有一个用于调度重复任务的JonScheduler,Vogella上有教程: http://www. vogella.com/tutorials/AndroidTaskScheduling/article.html . 简而言之:创建服务(InteneService),创建PendingIntent,指向该服务并计划AlarmManager,它将发送该Intent,这反过来又会释放您的IntentService.
For time intervals larger than 30 secs you should use AlarmManager instead of Handler's .postDelayed method. See these tutorials: https://developer.android.com/training/scheduling/alarms.html, http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/ . There is a JonScheduler for scheduling repeating tasks, Vogella has tutorial on it: http://www.vogella.com/tutorials/AndroidTaskScheduling/article.html . In a few words: you create Service (InteneService), create PendingIntent, pointing to that service and schedule AlarmManager, which will be sending that intent, which, in turn, sill be launcing your IntentService.
这篇关于如何将asyncTask更改为服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!