Попытка использовать AsyncTask для периодического обновления сервера

У меня есть метод, который должен периодически обновлять свой статус на сервере.

Я использую AsyncTask для запуска HTTP-вызова в фоновом режиме.

ПРОБЛЕМА: В методе onPostExecute после проверки AsyncTask.getStatus, он показывает предыдущую задачу, которая все еще выполняется, которая вызывает ошибку.

ОШИБКА: java.lang.IllegalStateException: Невозможно выполнить задачу: задача уже выполняется.

РАЗЛИЧНЫЕ СТРАТЕГИИ, ИСПОЛЬЗУЕМЫЕ ДЛЯ РЕШЕНИЯ ПРОБЛЕМЫ, НО НЕ РАБОТАЕТ

     1. Before Relaunching AsyncTask, checked the status, it is showing the thread is RUNNING.
     2. Called the AsyncTask.cancel(true), immediately before calling the AsyncTask.execute if it is still running. It turns out AsyncTask still RUNNING and taking more than 3 mins to get cancel. 

ПРИМЕЧАНИЕ: я проверил много подобных вопросов здесь, но не нашел полезным.

Я был бы очень признателен, если бы кто-нибудь из вас, ребята, дал мне пример для решения этой проблемы, спасибо за миллион заранее......

public class MainActivity extends Activity implements AsyncResponse{

ConnectServer asyncTask =new ConnectServer();



 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   asyncTask.delegate = this;
   setContentView(R.layout.activity_main);

   //Start updating server using below method
    loop();

}

   public void processFinish(String output){

    //this you will received result fired from async class of onPostExecute(result) method.
    //Log.v(TAG, output);
    if(output != null){

        //not using this at this point

    }
  }

   //Method that will call Async method to reach server

public void loop(){

      TextView b = (TextView) findViewById(R.id.mField);
       String str;
    try {
        str = asyncTask.execute(true).get();
        b.setText(str);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }



    // START SERVER CONNECTION       
    class ConnectServer extends AsyncTask<Boolean, String, String> {         
       public AsyncResponse delegate=null;   
       public int i = 0;
       private Activity activity;         
       public void MyAsyncTask(Activity activity) {
            this.activity = activity;
        }


       @Override
       protected String doInBackground(Boolean... params) {
             String result = null;
             StringBuilder sb = new StringBuilder();
               try {
                 // http post
                 HttpClient httpclient = new DefaultHttpClient();

                 HttpGet httppost = new HttpGet("http://192.168.0.21:8080");
                 HttpResponse response = httpclient.execute(httppost);
                 if (response.getStatusLine().getStatusCode() != 200) {
                     Log.d("GPSApp", "Server encountered an error");
             }

                 BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF8"));
                 sb = new StringBuilder();
                 sb.append(reader.readLine() + "\n");
                 String line = null;

                 while ((line = reader.readLine()) != null) {
                   sb.append(line + "\n");
             }

                 result = sb.toString();

            } catch (Exception e) {
                Log.e("log_tag", "Error converting result " + e.toString());
            }
              return result;
        }

        @Override
        protected void onPostExecute(String result) {


            TextView mField = (TextView) findViewById(R.id.mField);
            mField.setText(result+i);


            try {
                Thread.sleep(10000);
                //asyncTask =new ConnectServer();
                 i++;
                String str = asyncTask.execute(true).get();
                mField.setText(str+i);

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

         }

         protected void onPreExecute() {}
     }
   }

1 ответ

Вызовите getStatus(), чтобы получить статус AsyncTask. Если статус AsyncTask.Status.RUNNING, отмените его.

Другие вопросы по тегам