android应用程序在使用3g连接连接到webservice时挂起,并且可以正常使用WIFI

时间:2012-06-12 13:58:28

标签: android web-services 3g

我正在开发一个使用Web服务的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连接重新启动应用程序时,它会挂起并显示以下对话框 waiting dialog in 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);
        }

我看到了this post但是我没有得到好结果我正在解决这个问题2天 提前谢谢。

注意:此问题经常出现在应用程序第一次连接到服务之后,如果我按下等待并且应用程序继续,那么其他使用Web服务的活动将正常工作

4 个答案:

答案 0 :(得分:2)

我认为与Wi-Fi相比,你有3G的低速连接。所以使用Asynctask在单独的线程而不是主线程中从服务器加载数据。最好显示 ProgressDialog 在获取数据时。

在某些情况下,Apis可以在Wi-Fi中工作,也可能不在3G连接中。所以在设备浏览器中测试您的网址也是为了确认

答案 1 :(得分:0)

对于每个可能需要一段时间才能执行的任务,您应该使用AsyncTask。见http://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

我在您的代码中看到的问题是您没有在Thread中进行网络操作。 因此,如果您在主线程上执行异步操作,如果在5秒内没有收到响应,应用程序将显示在上面的对话框中。在您的情况下,3g连接可能需要5秒以上才能返回响应。

最好的选择是在Thread !!中包含以上代码

答案 3 :(得分:0)

我已经解决了这个问题,我有一个启动画面活动,我在其中使用C2DM并使用服务在该活动中注册设备

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

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

我将此代码放在asyncTask中并且没有阻止UI 感谢每一位试图帮助我的人