2014-02-03 4 views
0

Я застрял в этой проблеме в течение дня или двух, так что я решил посмотреть, может ли кто-нибудь помочь мне.Android HttpClient Asynctask

Текущая цель, которую я имею, заключается в создании HttpPost, который соединяется с и выполняет сценарий, который у меня есть на моем Wamp-сервере. Я реализовал класс, который расширяет AsyncTask и включает в себя 3 необходимых метода, необходимых для эффективного функционирования.

Сначала я покажу вам код, который я использовал, чтобы поместить переменные в объект Json, за которым следует класс JSONParser, который инициализирует HttpPost, а затем выполняет его.
Впоследствии я расскажу вам все о ошибках журнала и сужении проблемы; вы все знаете, что проблема может быть уже, и если вы не хотите читать ниже, вкратце, это вызвано линией кода, вызывающей класс парсера.

Примечание: Я использую это как отправную точку для этого типа работы, поэтому, пожалуйста, поймите, что это просто с точки зрения переданных параметров.

Дополнительная информация: Я использую Eclipse, и я тестирую встроенный эмулятор.

МЕТОД - CreateNewUser

/** 
* Background Async Task to Create new user 
*/ 
class CreateNewUser extends AsyncTask<String, String, String>{ 

/** 
* Before starting background thread show progress dialog 
*/ 
@Override 
protected void onPreExecute(){ 
    super.onPreExecute(); 
    pDialog = new ProgressDialog(AddUserActivity.this); 
    pDialog.setIndeterminate(false); 
    pDialog.setCancelable(true); 
    pDialog.show(); 
} 

/* 
* Creating user 
*/ 
@Override 
protected String doInBackground(String... args){ 

    String username = inputUsername.getText().toString(); 
    String password = inputPassword.getText().toString(); 

    // Building parameters 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("username", username)); 
    params.add(new BasicNameValuePair("password", password)); 

    // getting JSON object 
    // Note that create user url accepts POST method 
     JSONObject json = jsonParser.makeHttpRequest(url_create_user, "POST",params);    

    // check log cat for response 
    Log.d("Create Response", json.toString()); 

     // check for success tag 
     try { 
      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 
       // successfully created product 
       Intent i = new Intent(getApplicationContext(), MainActivity.class); 
       startActivity(i); 

       // closing this screen 
       finish(); 
      } else { 
       // failed to create product 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null;  
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    @Override 
    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once done 
     pDialog.dismiss(); 
    } 
} 

Далее JSONParser Класс:

public class JSONParser { 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() { 

    } 

    // function get JSON from URL 
    // by making HTTP POST or GET method 
    public JSONObject makeHttpRequest(String url, String method, 
      List<NameValuePair> params) { 

     // Making HTTP request 
     try { 

      // check for request method 
      if(method == "POST"){ 
       // request method is POST 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 
       httpPost.setEntity(new UrlEncodedFormEntity(params)); 

       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

      }else if(method == "GET"){ 
       // request method is GET 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       String paramString = URLEncodedUtils.format(params, "utf-8"); 
       url += "?" + paramString; 
       HttpGet httpGet = new HttpGet(url); 

       HttpResponse httpResponse = httpClient.execute(httpGet); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 
      }   

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      json = sb.toString(); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 
} 

Если я удалить строку: (JSONObject json = jsonParser.makeHttpRequest(url_create_user, "POST",params); ) - разумеется, с намереваясь Попробовать поймать вне, то программа не откажет , когда я нажимаю кнопку, вызывающую класс CreateNewUser.

Если я этого не делаю, моя программа вызывает экран загрузки, который вращается вокруг, пока он не перестанет отвечать на запросы, и попросит закрыть приложение.

Журналы описывают ASync ошибки и незаконные государственные из них:

E/AndroidRuntime(1132): FATAL EXCEPTION: AsyncTask #2 
E/AndroidRuntime(1132): Process: com.example.propertypanther, PID: 1132 
E/AndroidRuntime(1132): java.lang.RuntimeException: An error occured while executing 
doInBackground() 
E/AndroidRuntime(1132):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
E/AndroidRuntime(1132):  at 
java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
E/AndroidRuntime(1132):  at  
java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
E/AndroidRuntime(1132):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
E/AndroidRuntime(1132):  at 
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
E/AndroidRuntime(1132):  at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
E/AndroidRuntime(1132):  at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
E/AndroidRuntime(1132):  at java.lang.Thread.run(Thread.java:841) 
E/AndroidRuntime(1132): Caused by: java.lang.IllegalStateException: Target host must not 
be null, or set in parameters. scheme=null, host=null,  
path=localhost/android_connect/sqlconfig/create_user.php 
E/AndroidRuntime(1132):  at 
org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.jav 
a:591) 
E/AndroidRuntime(1132):  at 
org.apache.http.impl.client.DefaultRequestDirector.execute 
(DefaultRequestDirector.java:293) 

E/AndroidRuntime(1132):  at 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 

E/AndroidRuntime(1132):  at  
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
E/AndroidRuntime(1132):  at 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
E/AndroidRuntime(1132):  at 
com.example.propertypanther.JSONParser.makeHttpRequest(JSONParser.java:51) 

E/AndroidRuntime(1132):  at 
com.example.propertypanther.AddUserActivity$CreateNewUser.doInBackground 
(AddUserActivity.java:116) 

E/AndroidRuntime(1132):  at 
com.example.propertypanther.AddUserActivity$CreateNewUser.doInBackground 
(AddUserActivity.java:1) 
E/AndroidRuntime(1132):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
E/AndroidRuntime(1132):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
E/AndroidRuntime(1132):  ... 4 more 
I/Choreographer(1132): Skipped 82 frames! The application may be doing too much work on 
its main thread. 
I/Choreographer(1132): Skipped 58 frames! The application may be doing too much work on 
its main thread. 
E/WindowManager(1132): android.view.WindowLeaked: Activity 
com.example.propertypanther.AddUserActivity has leaked window 
com.android.internal.policy.impl.PhoneWindow$DecorView{b1e3d240 V.E..... R.....ID 0,0- 
729,192} that was originally added here 
E/WindowManager(1132): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348) 
E/WindowManager(1132): at 
android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248) 
E/WindowManager(1132): at 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 
E/WindowManager(1132): at android.app.Dialog.show(Dialog.java:286) 

E/WindowManager(1132): at 
com.example.propertypanther.AddUserActivity$CreateNewUser.onPreExecute 
(AddUserActivity.java:97) 

E/WindowManager(1132): at 
android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 
E/WindowManager(1132): at android.os.AsyncTask.execute(AsyncTask.java:535) 
E/WindowManager(1132): at 
com.example.propertypanther.AddUserActivity$2.run(AddUserActivity.java:78) 
E/WindowManager(1132): at android.os.Handler.handleCallback(Handler.java:733) 
E/WindowManager(1132): at android.os.Handler.dispatchMessage(Handler.java:95) 
E/WindowManager(1132): at android.os.Looper.loop(Looper.java:136) 
E/WindowManager(1132): at android.app.ActivityThread.main(ActivityThread.java:5017) 
E/WindowManager(1132): at java.lang.reflect.Method.invokeNative(Native Method) 
E/WindowManager(1132): at java.lang.reflect.Method.invoke(Method.java:515) 
E/WindowManager(1132): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
E/WindowManager(1132): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
E/WindowManager(1132): at dalvik.system.NativeStart.main(Native Method) 

Сценарий сами файлы работают, насколько я знаю - кроме того, программа не выполняет скрипт от того, что я могу сказать.

Если бы кто-нибудь мог мне помочь, я был бы очень признателен! Я понимаю, что вы все занятые люди, так что спасибо, что нашли время из вашего дня, если вы размещаете идеи :)

+0

Указывает ли URL-адрес какой-либо вещи «localhost»? – gunar

+0

Да, да, это будет причиной сбоев асинхронной задачи? Я сделал ip url 127.0.0.1. Есть ли общая проблема с подключением к серверам localhost wamp? – user3149699

+2

, если вы тестируете встроенный эмулятор, вы должны использовать 10.0.2.2 для подключения к localhost. – yat0

ответ

3

Ключ находится в исключительной ситуации:

Вызванный: Java .lang.IllegalStateException: целевой хост не должен быть null или задан в параметрах. Схема = нуль, хост = нуль,
путь = локальный/android_connect/sqlconfig/create_user.php

Я собираюсь предположить, что существует проблема кодирования, ты правильно включил «HTTP: // «в начале вашего URL-адреса и распечатали ли вы URL-адрес, который вы запрашиваете в LogCat, чтобы убедиться, что он выглядит правильно?

+0

Очень приятно поймать. Я выписал URL-адрес, и вы правы, я не поставил http: // перед ним. Впоследствии у меня все еще были ошибки журнала, но я чувствую, что приближаюсь к этой проблеме. У меня не было этого исключения IllegalStateException, но теперь у меня есть еще одна подсказка, в которой говорится, что 127.0.0.1 было отказано (HttpHostConnectException). – user3149699

+0

Я сделаю некоторое исследование того, что я написал выше (собирался сказать это, но, по-видимому, вводить это сообщение ... (забыл нажать ctrl enter для новой строки) ... :)) Спасибо! – user3149699

Смежные вопросы