如何将asyncTask更改为服务? [英] How I can change my asyncTask into service?

查看:88
本文介绍了如何将asyncTask更改为服务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何将我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆