2013-12-19 21 views
6

Ich traf einige seltsame Warnung mit asynctask.Ich lerne GCM, also versuche ich, die asynctask zu verwenden. diese ist die Warnung:Asynctask merkwürdiges Verhalten

Type safety: The method execute(Object...) belongs to the raw type AsyncTask. References to generic type AsyncTask<Params,Progress,Result> should be parameterized 

ich die Bedeutung dieses warning.IS es verstehen wollen, über Themen .warum es nicht sicher? und was ist das roh?

dies ist mein Code:

private void registerInBackground() { 
    // TODO Auto-generated method stub 



    new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... arg0) { 
      // TODO Auto-generated method stub 
      String msg = ""; 
      try { 
       if (gcm == null) { 
        gcm = GoogleCloudMessaging.getInstance(getApplicationContext()); 
       } 
       regid = gcm.register(SENDER_ID); 
       msg = "Device registered, registration ID=" + regid; 

       // You should send the registration ID to your server over HTTP, 
       // so it can use GCM/HTTP or CCS to send messages to your app. 
       // The request to your server should be authenticated if your app 
       // is using accounts. 
       sendRegistrationIdToBackend(); 

       // For this demo: we don't need to send it because the device 
       // will send upstream messages to a server that echo back the 
       // message using the 'from' address in the message. 

       // Persist the regID - no need to register again. 
       storeRegistrationId(getApplicationContext(), regid); 
      } catch (IOException ex) { 
       msg = "Error :" + ex.getMessage(); 
       // If there is an error, don't just keep trying to register. 
       // Require the user to click a button again, or perform 
       // exponential back-off. 
      } 
      return msg; 
     } @Override 
     protected void onPostExecute(Object result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      Toast.makeText(getApplicationContext(), ""+result.toString(), Toast.LENGTH_LONG).show(); 
     } 
    }.execute(null, null, null); 



} 

Dank

Antwort

3

AsyncTask ist ein generic Class parametrierbaren kann. Die Warnung bedeutet, dass Sie die Parameter explizit benennen sollten.

Die AsyncTask als AsyncTask<Params,Progress,Result> definiert ist, braucht es 3 Parameter Params, Progress und Result, dass jeder Typ/Klasse sein kann.

In Ihrem obigen Code geben Sie einen String in doInBackground() zurück. Der Rückgabewert von doInBackground() ist der dritte Parameter der AsyncTask (Result).

Um die Warnung weggehen, implementieren Ihre AsyncTask wie folgt aus:

new AsyncTask<Void, Void, String>() { 
     @Override 
     protected String doInBackground(Void... voids) { 
      String message = ""; 

      //do something 

      return message; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

     } 
    }.execute(); 
+0

es jetzt funktioniert. Vielen Dank –

0

Sein mit Generika zu tun. Die Eingabe der Klasse AsyncTask lautet AsyncTask<Params, Progress, Result>. Die Nachricht, die Sie erhalten, ist, weil Sie new AsyncTask() tun. Was Sie tun sollten, ist etwas wie new AsyncTask<Void, Void, Void>(), da Sie diese Typen sowieso nicht verwenden werden.

Die API-Referenz enthält weitere Informationen zum Thema. enter link description here

1

Normalerweise AsyncTask wird verwendet/instanziiert mit Parametern ... AsyncTask<Params, Progress, Result>. Was die Parameter bedeuten, sind:

  • Params:
  • Sie sind Objects, dass Sie die doInBackground() passieren in. Zum Beispiel, wenn ich die Params zu einem String initialisiere, kann ich jetzt auf den String-Parameter mit in meinem von params[0], params[1] usw. zugreifen. Dies ist einer der wichtigsten Parameter, den Sie angeben, weil Sie AsyncTask aufrufen können der Parameter, der im Thread doInBackground benötigt wird. wie neu AsyncTask().execute(string);

  • Fortschritt:
  • Wenn die AsyncTask man in der Regel die Aktivität zum Laden von Inhalten usw. belegt mit Sie den Fortschritt Parameter Kontext des Benutzers geben können, dass die Dinge so, wie sie sollten gehen. Angenommen, Sie blockieren die Benutzeroberfläche und teilen Ihrem Benutzer mit, dass Inhalte heruntergeladen werden. Mit diesem Fortschritt können Sie angeben, wie viel von Ihrem Inhalt heruntergeladen wurde. Wenn dieser Parameter beispielsweise ein integer ist, könnte ich den publishProgress() im Thread doInBackground aufrufen, um den Fortschritt des aktuell heruntergeladenen Inhalts anzuzeigen.

  • Ergebnis:
  • Normalerweise ist dies der einzige Parameter, der erlaubt ist, mit der Benutzeroberfläche zu interagieren. Angenommen, Sie haben Ihren Inhalt heruntergeladen. Und möchte angeben, dass die Operation abgeschlossen ist und eine Erfolgsmeldung anzeigt. Dies ist, wo Sie es tun. Beispielsweise möchten Sie eine String zurückgeben, dass der Download jetzt abgeschlossen ist. In Ihrem doInBackground Thread Sie return string; am Ende. Dieser Wert wird somit in die onPostExecute(String result) übergeben. Von dort können Sie textView.setText(result) setzen.

    Grundsätzlich ist AsyncTask basiert auf dem Prinzip der GENERICS und VARARGS (Java Konzepte)

    GENERICS was impliziert, dass der Parameter in AsyncTask von beliebiger Art sein kann und varargs Angabe, dass man in mehreren Werten innerhalb dieser Parameter senden.

    In Ihrem Fall, da Sie nichts Wichtiges tun, um die Benutzeroberfläche zu ändern, können Sie AsyncTask<Void, Void, Void> aufrufen. Zum besseren Verständnis der Funktionsweise des AsyncTask konnte man folgendes sehen: example.

    Es ist eine lange lesen, aber hoffen, dass dies auf Dinge löscht :)

    Verwandte Themen