2016-04-03 12 views
-1

Ich verwende diese Routine, um eine Funktion für immer für einen anderen Thread zu starten, aber jederzeit zu stoppen oder neu zu starten. Ich zwei Fehler jedoch erhalten zum Kompilieren (kommentiert):Warum wird diese AsyncTask-Implementierung nicht kompiliert?

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

Ihre doInBackground() aufgerufen wird etwas zu tun; muss einen Integer-Wert zurückgeben. und auch onPost implementieren (Integer-Ergebnis) {}; wo result ist der von der doInbacground() -Methode zurückgegebene Wert – HAXM

+2

@HAXM Nein, der Integer-Wert ist der Fortschritt, nicht das Ergebnis –

+0

Das ist die falsche Verwendung für eine AsyncTask. Du wirst einen Thread wollen. – 323go

Antwort

1

Ihr Problem ist, dass Ihre AsyncTask Erklärung nicht korrekt ist, versuchen Code unten:

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

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

     return null; 
    } 
} 

Hier ist ein komplettes Beispiel für Sie:

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

Aber ich möchte sie nicht verwenden und diese Variablen stimmen nicht mit meinem Fall überein. Ich verstehe nicht, was das Ergebnis ist? Ganze Zahl? "..."? ist storniert()? Wie man es hier benutzt und was man von MainActivity aus aufruft, um MyTask auszuführen oder/abzubrechen? –

+0

Aktualisiert mit neuer Antwort –

+0

Danke. Aber immer noch das gleiche. Ich habe auch meinen Beitrag aktualisiert –

1

Verwenden Sie Void nicht void als Rückgabetyp von doInBackground. Gefallen Sie diese

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


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

    @Override 
    protected void onPostExecute(Void aVoid) { 
    } 

und während dieser Aufgabe einfach

myTask.execute() 

Ich gehe davon aus Sie sind nicht mit dem Ergebnis in Ihren onPostExecute

+0

Es heißt Fehler "fehlende Return-Anweisung", sobald ich Void statt void verwende. Ich gebe nichts zurück.Ich will es nur als eine while-Schleife .. Ich aktualisierte meinen Beitrag jetzt –

+0

@FirstStep: aktualisierte Antwort, eigentlich habe ich es verpasst. Ich habe die gleiche Implementierung und es funktioniert wie Charme. – theJango

+0

Ich musste auch 'void' von myTask.execute() entfernen, da 'Void' auch nicht funktionierte. Jetzt bekomme ich einen neuen Fehler! –

Verwandte Themen