【问题标题】:How to run AsyncTask every X second in Android Studio?如何在 Android Studio 中每隔 X 秒运行一次 AsyncTask?
【发布时间】:2015-10-02 09:22:46
【问题描述】:

我正在执行从我的网络主机获取数据的 AsyncTask。为了让我检索数据,我需要重新打开我的应用程序。如何每秒获取数据?我知道 AsyncTask 只能执行一次,但我不仅需要它用于我的应用程序,还需要它来了解这个问题。希望向各位学习。

顺便说一下,这是我的代码:

class AsyncDataClass2 extends AsyncTask<String, Void, String>
{

    @Override
    protected String doInBackground(String... params) {
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
        HttpConnectionParams.setSoTimeout(httpParameters, 5000);

        HttpClient httpClient = new DefaultHttpClient(httpParameters);
        HttpPost httpPost = new HttpPost(params[0]);

        String jsonResult = "";
        try
        {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("username", params[1]));
            nameValuePairs.add(new BasicNameValuePair("password", params[2]));
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse response = httpClient.execute(httpPost);
            jsonResult = inputStreamToString(response.getEntity().getContent()).toString();

        }
        catch (ClientProtocolException e)
        {
            e.printStackTrace();
        }

        catch (IOException e)
        {
            e.printStackTrace();
        }
        return jsonResult;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String result) {

        if (result.equals("") || result == null)
        {
            Toast msg = Toast.makeText(MapsActivity.this, "connection failed", Toast.LENGTH_LONG);
            msg.setGravity(Gravity.CENTER, 0, 0);
            msg.show();
        }

        else
        {
            Toast msg = Toast.makeText(MapsActivity.this, "connected", Toast.LENGTH_LONG);
            msg.setGravity(Gravity.CENTER,0,0);
            msg.show();
        }

        try {
            JSONArray json = new JSONArray(result);

            for (int i = 0; i < json.length(); i++) {
                JSONObject e = json.getJSONObject(i);
                String point = e.getString("Point");

                String[] point2 = point.split(",");

                String devStatus = e.getString("Status");   //now, let's process the Status...
                String strOwner = e.getString("Owner");     //now, let's process the owner...

                //==============================================================================


                if (devStatus.equals("fire")) {
                    IsThereFire=true;
                }

            } //---End of FOR LOOP---//


        }//---end of TRY---//

        catch (JSONException e)
        {
            e.printStackTrace();
        }
    }

    private StringBuilder inputStreamToString(InputStream is)
    {
        String rLine = "";
        StringBuilder answer = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        try
        {
            while ((rLine = br.readLine()) != null)
            {
                answer.append(rLine);
            }
        }

        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return answer;
    }
}

编辑:

先生,这是我用的计时器..

///---CODE for the TIMER that ticks every second and synch to database to update status---///
    Thread t = new Thread() {

        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // HERE IS THE ACTUAL CODE WHERE I CALL THE ASYNCDATACLASS2
                            AsyncDataClass2 performBackgroundTask = new AsyncDataClass2();
                            // PerformBackgroundTask this class is the class that extends AsynchTask
                            performBackgroundTask.execute();
                        }
                    });
                }
            } catch (InterruptedException e) {
            }
        }
    };

    t.start();
    //---------------------------------------------------------------//

【问题讨论】:

  • 我怎样才能每秒获取数据? 这对于异步任务来说似乎太快了,无法互相跟进。你这样做的目的是什么?
  • 我正在尝试在我的数据库中检索状态,并且该状态每 X 秒更改一次。现在我想知道在不关闭-重新打开我的应用程序的情况下发生的变化,我该怎么做?
  • 如果你取出runOnUiThread() 和里面的整个Runnable,只留下AsyncTask 后面的AsyncTask 行会怎样?

标签: android timer android-asynctask intervals


【解决方案1】:

如果您需要以固定的时间间隔执行任务,您可以将 Timer 与 TimerTask 一起使用。它在与 UI 线程不同的线程上运行,这意味着您可以直接在其中运行 http 调用。你可以找到文档here

【讨论】:

  • 你能用 Timer/TimerTask 发布你的尝试吗?
  • 发帖完毕,先生,请看我的编辑。
【解决方案2】:

我认为您应该尝试使用TimerTask 或作业调度程序。

可以在herehere 找到有关作业调度程序的大量信息。

【讨论】:

    【解决方案3】:

    检查一下:

    Timer timer;
    
    private void startTimer() {
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
               new AsyncDataClass2  adc = new AsyncDataClass2("u","p");
               adc.execute();
            }
        }, 0, 1000);
    }
    

    然后在onCreate() 你写:

    startTimer();
    

    虽然,你应该考虑其他的 cmets,他们是有意义的,在 AsyncTask 中每秒从 web 服务器请求更新,这不是那么好做的事情。

    【讨论】:

    • 是的,先生,我会试试的。但是刷新数据的最佳时间是什么时候?每隔几秒或几分钟?
    • @Christina,你应该确定你想要什么,你真正需要什么频率,你有更多的时间间隔 - 那么系统/应用程序/服务器更好,如果你需要从服务器持续刷新那么你应该建立一些连接并使其保持活动状态,但是如果您可以在大约五分钟内获得一次信息,而不是使用 AsyncTask 可以做到这一点,在编程中您始终应该考虑不要做超出您需要的事情,这取决于应用程序速度、稳定性、开发时间和托管成本,使用 KISS 模型,保持简单))
    【解决方案4】:

    我认为这样进行并不是一个好主意,但您可以做到,当然只需简单的TimerTask(教程there

    基本上是这样的:

    public class MyTimerTask extends TimerTask {
        @Override
        public void run() {
            // Just start your AsyncTask and proceed, I didn't adapt the code to your task
            new AsyncDataClass2().execute()
        }
    }
    

    你的逻辑称之为:

    TimerTask timerTask = new MyTimerTask();
     // They're ms: 1000ms = 1s
     timer.scheduleAtFixedRate(timerTask, 0, 1000);
     timer.start();
    

    你在销毁你的Fragment/Activity时取消它

    timer.cancel();
    

    【讨论】:

    • 永远不要在 UI 线程上运行网络调用!
    • 先生,这听起来很有启发性。 (只是好奇)我永远不应该在 UI 线程上运行网络调用的原因是什么?请不要生我的气先生..
    • @Christina,您的应用会卡住而用户不知道发生了什么,或者按下按钮或...
    • @Christina 看看developer.android.com/training/basics/network-ops/… 较新的 Android 版本会导致您的应用程序崩溃,并在主线程上向您抛出网络错误
    • @Klotor 没错。为了让你记住它,我用大写了它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2018-11-18
    • 2017-09-28
    • 2016-07-24
    相关资源
    最近更新 更多