Приложение 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, оно зависает и отображает следующий диалог ожидание диалога в Android

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

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 дней с моей благодарностью заранее.

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


person Muhannad A.Alhariri    schedule 12.06.2012    source источник
comment
Что бы вы ни делали, обязательно исправьте граничные сети 3G, которые используют услуги оператора GSM для сбоя соединения во время входящих вызовов. Так как они умеют работать по одному.   -  person Gökhan Barış Aker    schedule 12.06.2012


Ответы (4)


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

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

person Abhi    schedule 12.06.2012
comment
на самом деле я использую эту функцию внутри асинхронной задачи и показываю индикатор выполнения. Кроме того, я проверяю URL-адрес во встроенном браузере, и он отлично работает как с 3g, так и с Wi-Fi. у меня 3g скорость выше чем у wi-fi - person Muhannad A.Alhariri; 12.06.2012
comment
Нет, ясно, что вы делаете что-то в основном потоке. Делайте в отдельном потоке. - person Abhi; 12.06.2012
comment
в основном потоке я использую asyntask.execte(), как я обновил выше - person Muhannad A.Alhariri; 12.06.2012
comment
Да, чувак, твой код выглядит хорошо.. в любом случае, завтра мы обсудим здесь.., теперь оставляем - person Abhi; 12.06.2012

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

person Alexandre B.    schedule 12.06.2012

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

Лучше всего включить приведенный выше код в тему!

person Vipul    schedule 12.06.2012

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

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

        registrationIntent.putExtra("sender", "[email protected]");
        startService(registrationIntent);

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

person Muhannad A.Alhariri    schedule 18.06.2012