1

私はphpでパラメータを取得するように作成し、Getメソッドを使用してリンクに送信しています。例: " http://example.com/subscribe/?act=SubscribeForEmail&EmailAddress= " 。

ユーザーが edittext (aa@gmail.com など) を入力して送信すると、次のように送信されます。

http://example.com/subscribe/?act=SubscribeForEmail&EmailAddress=aa@gmail.com . どうですか

アンドロイドで可能ですか?

これを例に使ってみました。しかし、それは強制的に閉じます

コードは次のとおりです。

EditText Ename;
Button btncreate;
String n = null;
String contentOfMyInputStream1;
String output = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Ename = (EditText)findViewById(R.id.msgTextField);
    btncreate = (Button)findViewById(R.id.sendButton);
    btncreate.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {   
    String st1;
    st1 = Ename.getText().toString();
    try {
        output = "http://example.com/subscribe/?act=SubscribeForEmail&EmailAddress="+st1;
        downloadUrl(output);//request been send
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
    if (output != null) {
        Toast.makeText(this, output, Toast.LENGTH_SHORT).show();
    }
}

public String downloadUrl(String url) throws IOException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpRequestBase httpRequest = null;
    HttpResponse httpResponse = null;
    InputStream inputStream = null;
    String response = "";
    StringBuffer buffer = new StringBuffer();
    httpRequest = new HttpGet(url); 
    httpResponse = httpclient.execute(httpRequest);
    inputStream = httpResponse.getEntity().getContent();
    int contentLength = (int) httpResponse.getEntity().getContentLength();
    if (contentLength < 0)  {
        // Log.e(TAG, "The HTTP response is too long.");
    }
    byte[] data = new byte[256];
    int len = 0;
    while (-1 != (len = inputStream.read(data)) ) {
        buffer.append(new String(data, 0, len));
    }
    inputStream.close();
    response = buffer.toString();
    return response;
}

次のようにエラーが発生しています

Fatal Exception:main
android.os.NetworkOnMainTreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
at java.net.InetAddress.lookHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:385)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)

問題を解決するのを手伝ってください。

前もって感謝します。

4

3 に答える 3

1

と同じくらい簡単Exceptionです。メインでネットワーク関連のものを実行しますThreadAsyncTaskまたは aを使用してメソッドnew Threadを実行しますdownloadUrl

ここから取ったこのサンプルコードを使用してください:

private class LongOperation extends AsyncTask<String, Void, String> {

      @Override
      protected String doInBackground(String... params) {
            //Here you put your downloadUrl() method.
            //because this method does stuff in background
            return downloadUrl(params[0])
      }      

      @Override
      protected void onPostExecute(String output) {
          //after downloading is finished, toast it.
          if (output != null)
              Toast.makeText(this, output, Toast.LENGTH_SHORT).show();
      }

      @Override
      protected void onPreExecute() {
      }

      @Override
      protected void onProgressUpdate(Void... values) {
      }
}   

次の 2 行で呼び出します。

LongOperation downloadTask = new LongOperation();
downloadTask.execute(output);

このサイトも役立つかもしれません。

于 2013-02-07T06:00:49.567 に答える
0

Android では、メイン (UI) スレッドで時間のかかるタスク (ネットワーク操作など) を実行することはできません。http リクエストを作成する必要がある場合は、別のスレッドで作成する必要があります。

AsyncTask を使用するか、単に新しいスレッドで生成します。

于 2013-02-07T06:00:09.103 に答える
0

Honeycombe の UI スレッドでネットワーク IO を実行することはできません。技術的に、以前のバージョンの Android でも可能ですが、アプリが応答しなくなり、OS が不適切な動作のためにアプリを強制終了する可能性があるため、非常に悪い考えです。バックグラウンド プロセスを実行するか、AsyncTask を使用してバックグラウンド スレッドでネットワーク トランザクションを実行する必要があります。

Android 開発者サイトには、 Painless Threadingに関する記事があります。これは、これについての優れた紹介であり、ここで現実的に提供できるよりもはるかに深い回答を提供します。

于 2013-02-07T06:07:33.593 に答える