0

我正在开发一个使用 web 服务的 android 应用程序,服务输出是 XML

我正在使用此代码连接到 Web 服务

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);
        }

我看到了 这篇文章,但我没有一个好的结果我提前两天在这个问题上工作,在此先感谢。

注意:这个问题通常在应用程序第一次连接到服务时出现

4

4 回答 4

2

我认为与 Wi-Fi 相比,您的 3G 连接速度较低。因此,请使用Asynctask在单独的线程而不是主线程中从服务器加载数据。在获取数据时显示ProgressDialog是个好主意。

并且在某些情况下,Apis 将在 Wi-Fi 中工作,并且可能无法在 3G 连接中。所以在设备浏览器中测试您的 url 以使其确认

于 2012-06-12T14:08:42.423 回答
0

您应该为每个可能需要一些时间才能执行的任务使用 AsyncTask。请参阅http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-06-12T14:04:35.387 回答
0

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

最好的办法是在 Thread 中包含上面的代码!

于 2012-06-12T14:04:55.143 回答
0

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

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

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

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

于 2012-06-18T13:34:31.910 回答