#android #http #android-asynctask
#Android #http #android-asynctask
Вопрос:
я работаю над отправкой формы на сервер Google и получением ответа в виде html-строки, и, наконец, я помещаю эту строку в webview для отображения результата …. я использую для этого асинхронную задачу, она показывает диалоговое окно прогресса, но несколько раз оно показывает мне сообщение «принудительно закрыть» без каких-либо изменений, которые я делаю в коде….это означает, что прогнозирование выходных данных является неожиданным… Мой код выглядит следующим образом……
public class Urlasync extends Activity {
WebView engine=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new AddStringTask().execute();
}
class AddStringTask extends AsyncTask<Void, Void, HttpResponse>
{
HttpResponse end = null;
String endResult = null;
public static final int TIMEOUT_MS=10000;
HttpClient client=null;
HttpPost post =null;
List<NameValuePair> pairs=null;
BasicResponseHandler myHandler=null;
private final ProgressDialog dialog = new ProgressDialog(Urlasync.this);
@Override
protected void onPreExecute() {
client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), TIMEOUT_MS);
HttpConnectionParams.setSoTimeout(client.getParams(), TIMEOUT_MS);
post = new HttpPost("http://www.google.com/m");
pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("hl", "en"));
pairs.add(new BasicNameValuePair("gl", "us"));
pairs.add(new BasicNameValuePair("source", "android-launcher-widget"));
pairs.add(new BasicNameValuePair("q", "persistent"));
try {
post.setEntity(new UrlEncodedFormEntity(pairs));
SystemClock.sleep(400);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.dialog.setMessage("starts...");
this.dialog.show();
}
@Override
protected HttpResponse doInBackground(Void... arg0) {
try {
HttpResponse response = client.execute(post);
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
return response;
}
end = response;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) { //this exception is called
e.printStackTrace();
}
return end;
}
@Override
protected void onPostExecute(HttpResponse params) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if(params!=null)
{
String endResult=null;
BasicResponseHandler myHandler = new BasicResponseHandler();
try {
endResult = myHandler.handleResponse(params);
} catch (HttpResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
engine = (WebView)findViewById(R.id.webview);
engine.loadDataWithBaseURL("http://", endResult, "text/html", "UTF-8", null);
setContentView(R.layout.main);
engine.requestFocus(View.FOCUS_DOWN);
}
Toast.makeText(Urlasync.this, "Done!", Toast.LENGTH_SHORT).show();
}
}
}
предложения с кодом приветствуются
спасибо..
Комментарии:
1. Какое исключение возникает? Пожалуйста, добавьте выходные данные журнала cat.
2. он говорит мне «принудительно закрыть»..
3. это говорит мне, что приложение неожиданно останавливается..
4. Прочитайте о LogCat, здесь вы можете найти причину вашей проблемы
5. исключением является исключение NullPointerException ..в org.apache.http.impl.client.BasicResponceHandler.handleresponce
Ответ №1:
Вы ничего не должны делать с пользовательским интерфейсом в doInBackground
(например, показывать Toast
). Сделайте это в onPostExecute
или в onProgressUpdate
вместо этого.
Комментарии:
1. в doInBackground я получаю Httpresponce, затем в onPostExecute я анализирую его, показываю всплывающее окно и отображаю этот ответ в webview… но я кое-где читал, что для асинхронной задачи требуется поток пользовательского интерфейса, поэтому я его поместил..
2. Удалите показываемый тост из
doInBackground
или переместите его вonPostExecute
.3. исключением является исключение NullPointerException ..в org.apache.http.impl.client.BasicResponceHandler.handleresponce
4. Вы тоже делаете это в
doInBackground
, но вы не должны:protected HttpResponse doInBackground(Void... arg0) { ... Toast.makeText(Urlasync.this, "Done execute!", Toast.LENGTH_SHORT).show(); ...
5. Отладьте
onPostExecute
и найдите, чтоparams
равно нулю