2016-04-03 5 views
-1

Я использую эту процедуру для запуска вечной функции в другом потоке, но останавливаю ее в любое время или перезапускаю. Тем не менее, я получаю две ошибки на компиляции (с комментариями):Почему эта реализация AsyncTask не компилируется?

public class MainActivity extends AppCompatActivity 
    { 
      protected void onCreate(Bundle savedInstanceState) { 

     StrtBtn.setOnClickListener(
      new Button.OnClickListener() { 
       public void onClick(View v) { 
        // I want to start the function on another thread here 
        myTask = new MyTask(); 
        myTask.execute(); 
        }}); 

      StpBtn.setOnClickListener(
       new Button.OnClickListener() { 
        public void onClick(View v) { 
        // I want to stop the function 
        message = "StopVideo"; 
        myTask.cancel(true); 
        }}); 

      public void MyFunction() 
      { 
       // whatever 
      } 
     } 

public class MyTask extends AsyncTask<Void, Void, Void> // Error: class 'MyTask' is public, should be declared in a file named 'MyTask.Java' 
{ 
    protected Void doInBackground(Void... params) 
    { 
     while(!isCancelled()) 
     { 
      // my code here to call the function here 
     } 
    } 
} 
+0

Ваш doInBackground(); должен возвращать целочисленное значение типа. а также реализовать onPost (целочисленный результат) {}; где result - значение, возвращаемое методом doInbacground() – HAXM

+2

@HAXM Нет, значение Integer - это прогресс, а не результат –

+0

. Это неправильное использование для AsyncTask. Вам понадобится Тема. – 323go

ответ

1

Ваша проблема заключается в том, что ваша AsyncTask декларация не является правильным, попробуйте ниже код:

public class MyTask extends AsyncTask<Void, Void, Void>{ 

    protected Void doInBackground(Void... params){ 
      // .. 
      while(NotCancelled){ 
      // my code to call the function here 
      } 
     } 

     return null; 
    } 
} 

Вот полный пример для вас:

public class MainActivity extends AppCompatActivity { 
    protected void onCreate(Bundle savedInstanceState) { 

     StrtBtn.setOnClickListener(
      new Button.OnClickListener() { 
       public void onClick(View v) { 
        // I want to start the function on another thread here 
        myTask = new MyTask(); 
        myTask.execute(); 
       } 
      }); 

    StpBtn.setOnClickListener(
      new Button.OnClickListener() { 
       public void onClick(View v) { 
        // I want to stop the function 
        message = "StopVideo"; 
        myTask.cancel(true); 
       } 
      }); 
    } 

    public void MyFunction() { 
     // whatever 
    } 


    private class MyTask extends AsyncTask<Void, Void, Void> // Error: class 'MyTask' is public, should be declared in a file named 'MyTask.Java' 
    { 
     protected Void doInBackground(Void... params) { 
      while (!isCancelled()) { 
       // my code here to call the function here 
      } 
      return null; 
     } 
    } 
} 
+0

Но я не хочу их использовать, и эти переменные не соответствуют моему делу. Я не понимаю, что получается? Integer? «...»? isCancelled()? Как использовать его здесь и что вызывать из MainActivity для выполнения MyTask или/и отменить его? –

+0

Обновлено с новым ответом –

+0

Спасибо. Но все равно то же самое. Я тоже обновил свой пост –

1

Использовать Void не void как возвращаемый тип doInBackground. Как это

class MyTask extends AsyncTask<Void,Void,Void>{ 


    protected Void doInBackground(Void... params){ 
     // Your code here 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
    } 

и при вызове этой задачи простой

myTask.execute() 

Я предполагаю, что Вы ничего не делаете с результатом в вашем onPostExecute

+0

Он говорит об ошибке «Отсутствие инструкции возврата», как только я использую Void вместо void. Я ничего не возвращаю.Я хочу, чтобы это было как только цикл while. Я обновил свой пост сейчас –

+0

@FirstStep: обновленный ответ, на самом деле я пропустил его. У меня такая же реализация и ее работа, как прелесть. – theJango

+0

Мне также пришлось удалить «void» из myTask.execute(), так как «Void» также не работал. Теперь я получаю новую ошибку! –

Смежные вопросы