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接続でアプリケーションを再起動すると、アプリケーションがハングして次のダイアログが表示されます。 アンドロイドで待機中のダイアログ

このコードに加えて、私は別のメソッド内でこのメソッドを使用しています

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日間取り組んでおり、事前に感謝しています。

注:この問題は、アプリケーションがサービスに初めて接続したときによく発生します。その後、待機を押してアプリケーションを続行すると、Webサービスを使用する他のすべてのアクティビティが正常に機能します。

4

4 に答える 4

2

Wi-Fiに比べて3Gの接続速度が遅いと思います。そのため、Asynctaskを使用て、メインスレッドではなく別のスレッドでサーバーからデータをロードします。データの取得中にProgressDialogを表示することをお勧めします。

場合によっては、Api は 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

私があなたのコードで見ている問題は、スレッドでネットワーク操作を行っていないことです。そのため、メイン スレッドで非同期操作を実行する場合、アプリケーションが 5 秒以内に応答を受信しない場合、アプリケーションは上記のダイアログを表示します。この場合、3g 接続は応答を返すのに 5 秒以上かかる場合があります。

最善の策は、上記のコードをスレッドに含めることです!!

于 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 に答える