1

私はAndroidプログラミングに非常に慣れていないので、HttpClientを使用してAndroidからphp Webサービスを呼び出そうとしました。しかし、アプリの実行中に「残念ながらServiceTestが停止しました」と言って停止し、終了しました。以下は私のコードです。

public class ServiceTestActivity extends Activity {
private Button btn;
private TextView txt;
String result = ""; 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btn = (Button) findViewById(R.id.button1);
    txt = (TextView) findViewById(R.id.txt_name);
    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            callWebErvice("http://localhost/mvc/login/test");

        }
    });

}

public void callWebErvice(String serviceURL) {

        HttpClient httpclient = new DefaultHttpClient();  
        HttpGet request = new HttpGet(serviceURL);  

        ResponseHandler<String> handler = new BasicResponseHandler();  
        try {  
            result = httpclient.execute(request, handler); 
            txt.setText(result);
        } catch (ClientProtocolException e) {  
            e.printStackTrace();  

        } catch (IOException e) {  
            e.printStackTrace();  

        }  
        httpclient.getConnectionManager().shutdown();  

        Log.i("my result", result);  
    } // end callWebServe
}

誰でもこの理由を見つけることができますか?

4

2 に答える 2

0

logcat を使用せずにコードのバグを見つけるのは非常に困難です。この回答を使用することをお勧めします。

 InputStream retrieveStream(String url) {

        DefaultHttpClient client = new DefaultHttpClient();

        HttpGet getRequest = new HttpGet(url);

        try {

            HttpResponse getResponse = client.execute(getRequest);
            final int statusCode = getResponse.getStatusLine().getStatusCode();

            if (statusCode != HttpStatus.SC_OK) {
                Log.w(getClass().getSimpleName(), "Error " + statusCode
                        + " for URL " + url);
                return null;
            }

            HttpEntity getResponseEntity = getResponse.getEntity();
            return getResponseEntity.getContent();

        } catch (IOException e) {
            getRequest.abort();
            Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
        }

        return null;

    }

このコードを使用して、入力ストリームを文字列で読み取り可能なデータ形式に変換します。

BufferedReader r = new BufferedReader(new InputStreamReader(retrieveStream("YOU URL")));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
    total.append(line);
}

ありがとう :)

于 2012-07-21T14:51:32.917 に答える
0

UI スレッドで絶対に実行してはならない 3 種類の操作があります。

  1. ネットワーク操作。
  2. DB操作
  3. ファイル操作。

あなたのコードから、UI スレッドでネットワーク操作を実行していることがわかります。これは間違いなく ANR (Application Not Responding) につながります。

ANR がアプリケーションで発生するたびに、Android はアプリケーションを強制終了します。

ネットワーク操作を実行するには、ワーカー スレッドを使用する必要があります。

于 2012-07-21T15:12:47.450 に答える