2013-12-19 15 views
6

asynctaskで奇妙な警告を受けました。GCMを学んでいるので、asynctaskを使用しようとしました。私はスレッドが、それは安全ではない.whyについては、これはそれをwarning.ISの意味を理解したいAsynctask strange behavior

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

: これは警告ですか?これは何ですか?

これは私のコードです:ジェネリックを行うには

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); 



} 

おかげ

答えて

3

AsyncTaskをパラメータ化することができますgeneric Classでいます。警告は、パラメータに明示的に名前を付ける必要があることを意味します。

AsyncTaskは,ProgressおよびResultの3つのタイプ/クラスにすることができます。

上記のコードでは、doInBackground()の文字列を返します。 doInBackground()の戻り値はAsyncTaskResult)の3番目のパラメータです。

このようなあなたのAsyncTaskを実装し、警告が離れて行くようにするに:それは動作するようになりまし

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

。 ありがとう –

0

そのを。 AsyncTaskクラスのタイピングはAsyncTask<Params, Progress, Result>です。あなたがしているメッセージは、あなたがnew AsyncTask()をやっているからです。とにかくそれらのタイプを使用するつもりはないので、あなたがするべきことはnew AsyncTask<Void, Void, Void>()のようなものです。

APIリファレンスには、この件に関する詳細情報があります。 enter link description here

1

通常、AsyncTaskは、パラメータ... AsyncTask<Params, Progress, Result>を使用してインスタンス化されています。どのようなパラメータが意味することは、次のとおりです。

  • のparams:
  • 彼らはあなたが doInBackground()に渡す Objectsです。たとえば、は、 Stringに初期化すると、の params[0], params[1]などの文字列パラメータにアクセスできるようになりました。これは AsyncTaskを呼び出す際に指定できる最も重要なパラメータの1つですスレッドの doInBackgroundに必要なパラメータ新しい AsyncTask().execute(string);よう

  • 進捗状況:通常あなたは物事は、彼らが必要道を進んでいることを、ユーザーのにコンテキストを与えるために進捗パラメータを使用することができるなどのロードコンテンツのアクティビティを占め
  • AsyncTask 1を使用。コンテンツをダウンロードしていることをユーザーに知らせるユーザーインターフェイスをブロックしているとします。この進捗状況によって、ダウンロードされたコンテンツの量を指定することができます。たとえば、このパラメータが integerの場合、 doInBackgroundスレッドの publishProgress()を呼び出して、現在ダウンロード中のコンテンツの進行状況を表示できます。

  • 結果:
  • 通常、これは、ユーザインターフェースと相互作用させる唯一のパラメータです。コンテンツのダウンロードが完了したとします。また、操作が完了して成功メッセージが表示されるように指定する必要があります。これがあなたのやり方です。たとえば、ダウンロードが完了したことを示す Stringを返すとします。 doInBackgroundスレッドでは、最後に return string;となります。この値は onPostExecute(String result)に渡されます。そこから textView.setText(result)を設定することができます。

    基本的にAsyncTaskはGENERICSVARARGS(Javaの概念)AsyncTaskでパラメータを使用すると、これらのパラメータ内に複数の値を送信できるように指定する任意のタイプとVARARGSのものとすることができることを意味している

    ジェネリック医薬品の原理に基づいています。

    あなたは、UIを変更するために何か重要なことをしていないので、​​と呼ぶことができます。 AsyncTaskの動作をよりよく理解するためには、exampleが表示されます。

    それは、長い間読んでますが、これは物事をクリア願っています:)