проблема в реализации асинхронной задачи httpconnection

#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 равно нулю