Android-приложение зависает при подключении к веб-сервису через 3G-соединение и прекрасно работает с WIFI

Я занимаюсь разработкой приложения для Android, которое использует веб-сервис, вывод сервиса - XML

Я подключаюсь к веб-сервису, используя этот код

public  String converse(String host, int port, String path)
            throws IOException, URISyntaxException {

        BufferedReader in = null;
        String serviceResponse = null ;
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            String serviceUrl = "http://"+host+":"+port+path;
            System.out.println("service url "+serviceUrl);
            request.setURI(new URI(serviceUrl));

            System.out.println("Request "+request.toString());
            HttpResponse response = client.execute(request);

            in = new BufferedReader
            (new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            while ((line = in.readLine()) != null) {
                sb.append(line + NL);
            }
            in.close();
            serviceResponse  = sb.toString();

            } finally {
            if (in != null) {
                try {
                    in.close();
                    } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return serviceResponse;
    }

когда приложение запускается с WI-FI, все работает нормально, а когда я перезагружаю приложение с подключением 3G, оно зависает и отображает следующее диалоговое окно диалог ожидания в андроид

В дополнение к этому коду я использую этот метод внутри другого метода

public void fillAdapter() {
        //calling web service using the mentioned method
    }

И эта функция используется внутри асинхронной задачи для заполнения адаптера ListView

protected class AsyncLoading extends AsyncTask<Void,Void, BaseModel[]>{

        @Override 
        protected void onPreExecute(){
            pd =ProgressDialog.show(BaseListActivity.this, "loading in progress", "waiting .");
        }
        @Override
        protected BaseModel[] doInBackground(Void... params) {
            fillAdapter();
            return listItems;

        }
        @Override
        protected void onPostExecute(BaseModel[] doc){
            //list.setAdapter(doc);
            if(doc != null) {
            if(doc.length > 0 ) {
                if(doc[0] instanceof Activity)
                    adapter = new OffersListAdapter(getApplicationContext(),doc);
                else if (doc[0] instanceof Offer)
                    adapter = new OffersListAdapter(getApplicationContext(),doc);
                else if (doc[0] instanceof Branch) {
                    adapter = new BranchListAdapter(getApplicationContext(),doc);
                    Log.i("Branch"," Added Branch");
                }else if (doc[0] instanceof Consolation) {
                    adapter = new ListAdapter(getApplicationContext(),doc);
                    adapter.setDisplayImage(false);
                }else if ( doc[0] instanceof Event) {
                    adapter = new EventListAdapter(getApplicationContext(),doc);

                }
                else
                    adapter = new ListAdapter(getApplicationContext(),doc);

            }//end if doc != null
                list.setAdapter(adapter);

            }
            handler.sendEmptyMessage(0);
        }

Я видел этот пост, но у меня нет хорошего результата. Я работаю над этой проблемой уже 2 дня, заранее благодарю.

Примечание. Эта проблема часто возникает при первом подключении приложения к службе, после чего, если я нажал "Ждать", а приложение продолжило работу, все другие действия, потребляющие веб-службу, будут работать нормально.

4 ответа

Решение

Я решил проблему, что у меня есть экранная заставка, внутри которой я использую C2DM и регистрирую устройство в этой активности, используя сервис

            registrationIntent.putExtra("app", PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(), 0));

        registrationIntent.putExtra("sender", "someemailaddress@gmail.com");
        startService(registrationIntent);

Я поместил этот код в asyncTask и не блокировал пользовательский интерфейс. Спасибо всем, кто пытался мне помочь.

Я думаю, что у вас низкоскоростное соединение 3G по сравнению с Wi-Fi. Так что используйте Asynctask для загрузки данных с сервера в отдельном потоке, а не в основном потоке. Хорошей идеей будет показать ProgressDialog при получении данных.

И в некоторых случаях Apis будет работать в Wi-Fi и может не работать в 3G-соединении. Так что проверьте свой URL в браузере устройства, чтобы подтвердить

Вы должны использовать AsyncTask для каждой задачи, выполнение которой может занять некоторое время. См. http://developer.android.com/reference/android/os/AsyncTask.html

Проблема, которую я вижу с вашим кодом, заключается в том, что вы не выполняете сетевую операцию в Thread. Поэтому, если вы выполняете асинхронную операцию в главном потоке, приложение отобразит диалоговое окно выше, если оно не получит ответ в течение 5 секунд. В вашем случае 3g-соединению может потребоваться более 5 секунд, чтобы вернуть ответ.

Лучшая ставка - включить вышеуказанный код в тему!

Другие вопросы по тегам