Задать вопрос

Как передать переменную (List) при создании подкласса AsyncTask в Android?

Недавно начал программировать под Android. Столкнулся с проблемой. Сначала написал код класса без передачи значения (работает нормально, среда разработки eclipse+ADT):
Первый вариант кода
private class PostDataSendClass extends AsyncTask<Void,Void,Void> {
	 protected Void doInBackground(Void... paramsf) {
	    	 HttpClient httpclient = new DefaultHttpClient();
	 		HttpPost httppost = new HttpPost("http://site.com/");
	 		httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
	 		httppost.setHeader("Accept", "application/json");

	 		List<NameValuePair> params = new ArrayList<NameValuePair>(2);
	 		params.add(new BasicNameValuePair("act", "getToken"));
	 		params.add(new BasicNameValuePair("hash", "12345"));

	 		try {
				httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

	 		HttpResponse response = null;
			try {
				response = httpclient.execute(httppost);
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	 		HttpEntity entity = response.getEntity();
          
	 		try {
				Log.d("BAR","Ans:"+EntityUtils.toString(entity,"UTF-8"));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
 
	    	 return null;
	     }
	 }

//вызов при нажатии на кнопку
public void post_Click(View v){
	Log.d("BAR","POst_test_click");
	new PostDataSendClass().execute();
}


Затем List params, который создается в классе выше, во втором варианте я попытался передать при создании класса (когда нажимается кнопка), однако я не знаю какой тип применить, в любом случае, происходит ошибка типов или среда выносит ошибки:
Второй вариант кода
private class PostDataSendClass extends AsyncTask<List<NameValuePair>,Void,Void> {	
   protected Void doInBackground(List<NameValuePair>... paramsto) {
	    	 HttpClient httpclient = new DefaultHttpClient();
	 		HttpPost httppost = new HttpPost("http://site.com/");
	 		httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
	 		httppost.setHeader("Accept", "application/json");
	 		
	 		try {
/*На след. строчку "ругается" среда, а именно ошибка:
 <<The constructor UrlEncodedFormEntity(List<NameValuePair>[], String) is undefined>>*/
			      httppost.setEntity(new UrlEncodedFormEntity(paramsto, "UTF-8")); 
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

	 		HttpResponse response = null;
			try {
				response = httpclient.execute(httppost);
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	 		HttpEntity entity = response.getEntity();
          
	 		try {
				Log.d("BAR","Ans:"+EntityUtils.toString(entity,"UTF-8"));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
 
	    	 return null;
	     }
	 }

//вызов
public void post_Click(View v){
		Log.d("BAR","Post_test_click");
		List<NameValuePair> vars = new ArrayList<NameValuePair>(2);
		vars.add(new BasicNameValuePair("act", "getToken"));
		vars.add(new BasicNameValuePair("hash", "12345"));
		new PostDataSendClass().execute(vars); //здесь ошибка: Type safety: A generic array of 
//List<NameValuePair> is created for a varargs parameter
    }



Подскажите, пожалуйста, как правильно организовать это дело.
P.S. В заголовке вопроса Тостер убрал угловые скобки и оставил List вместо List<NameValuePair>
  • Вопрос задан
  • 2840 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
anyd3v
@anyd3v
Потому что конструктор UrlEncodedFormEntity:
public UrlEncodedFormEntity(java.util.List<? extends org.apache.http.NameValuePair> parameters, java.lang.String encoding) throws java.io.UnsupportedEncodingException { /* compiled code */ }

В то время как paramsto это wildcard аргумент (считай коллекция), нужно взять элемент этой коллекции (те paramsto[0])

те в итоге
httppost.setEntity(new UrlEncodedFormEntity(paramsto[0], "UTF-8")

вам бы не мешало прочитать про Java
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы