1

最新の Java Eclipse ソフトウェアを使用していますが、この HttpPost コードを実行するとエミュレータがクラッシュします。ラップトップにuniserverをインストールしたので、それをサーバーとして使用しています。

このコードは、前のクラスから編集テキスト データを呼び出し、HttpPost 要求を使用して、このデータをオンライン フォームのそれぞれのフィールドに投稿することになっています。

編集するテキストデータは「From」「To」「Message」の3項目です。また、サーバー上で作成したフォームにも、データを入力するための同じフィールドがあります。(" http://19x.xx.xx.xxx/androidp2p/testform.php ") 19x.xx.xx.xxx は私の (localhost) IP アドレスです。

前のクラスからそのデータを正しく取得しています。私のコードは、オンラインで見つけた HttpPost の例に似ていますが、なぜクラッシュするのかわかりません。

何か支援が得られるかどうかを確認しようとした HttpPost メソッドを添付しました。よろしくお願いします。

方法 1:

String myBreadu, myBreadr, myBreadm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Bundle myBasket = getIntent().getExtras();
    myBreadu = myBasket.getString("keyfrom");
    myBreadr = myBasket.getString("keyto");
    myBreadm = myBasket.getString("keymsg");
    // Create a new HttpClient and Post Header
    HttpClient client = new DefaultHttpClient();
    String postURL = ("http://19x.xx.xx.xxx/androidp2p/testform.php");
    HttpPost post = new HttpPost(postURL);
    try {
        // Add the data
        List<NameValuePair> pairs = new ArrayList<NameValuePair>(3);
        pairs.add(new BasicNameValuePair("keysendu", myBreadu));
        pairs.add(new BasicNameValuePair("keysendr", myBreadr));
        pairs.add(new BasicNameValuePair("keysendm", myBreadm));
        UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(pairs);
        post.setEntity(uefe);
        // Execute the HTTP Post Request
        HttpResponse response = client.execute(post);
        // Convert the response into a String
        HttpEntity resEntity = response.getEntity();
        if (resEntity != null) {
            Log.i("RESPONSE", EntityUtils.toString(resEntity));
        }
    } catch (UnsupportedEncodingException uee) {
        uee.printStackTrace();
    } catch (ClientProtocolException cpe) {
        cpe.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }

}

方法 2:

String myBreadu, myBreadr, myBreadm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Bundle myBasket = getIntent().getExtras();
    myBreadu = myBasket.getString("keyfrom");
    myBreadr = myBasket.getString("keyto");
    myBreadm = myBasket.getString("keymsg");
    String result = null;
    // Create a new HttpClient and Post Header
    HttpClient client = new DefaultHttpClient();
    String postURL = ("http://186.45.107.129/androidp2p/testform.php");
    HttpPost post = new HttpPost(postURL);
    try {
        // Add the data
        List<NameValuePair> pairs = new ArrayList<NameValuePair>(3);
        pairs.add(new BasicNameValuePair("keysendu", myBreadu));
        pairs.add(new BasicNameValuePair("keysendr", myBreadr));
        pairs.add(new BasicNameValuePair("keysendm", myBreadm));
        UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(pairs);
        post.setEntity(uefe);
        // Execute the HTTP Post Request
        HttpResponse response = client.execute(post);
        // Convert the response into a String
        HttpEntity resEntity = response.getEntity();
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String l = "";
        StringBuilder sb = new StringBuilder();
        while ((l = rd.readLine()) != null) {
            sb.append(l + "\n");
        }
        rd.close();
        String result = sb.toString(); // this line gives an error "Duplicate local variable result"
    } catch (UnsupportedEncodingException uee) {
        uee.printStackTrace();
    } catch (ClientProtocolException cpe) {
        cpe.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }

}

これはtestform.PHPです

テストフォーム

差出人:
宛先:
メッセージ:

もう1つ追加してもらえますか?データをフォームに直接送信する必要があるのか​​ 、それとも私が持っているこの他のPHPページに送信する必要があるのか​​ わかりません..

ちなみに、HttpPost を実行しようとするとログに記録されるエラーは次のとおりです。

FATAL EXCEPTION: main

03-07 11:36:23.226: E/AndroidRuntime(1490): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.project.keegan/com.project.keegan.SendPostMethod}: android.os.NetworkOnMainThreadException

03-07 11:36:23.226: E/AndroidRuntime(1490):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)

03-07 11:36:23.226: E/AndroidRuntime(1490):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)

03-07 11:36:23.226: E/AndroidRuntime(1490):     at android.app.ActivityThread.access$600(ActivityThread.java:130)

これがあまりにも多くの情報である場合は申し訳ありません。ありがとう。

4

1 に答える 1

1

すべてのネットワーク操作を行うには、 AsyncTaskを使用する必要があります。

メイン UI スレッドでネットワーク操作を行うと、ネットワーク操作に時間がかかり、UI が応答しなくなる可能性があります。また、UI が長時間フリーズすると、アプリが OS によって強制終了される可能性があります。

したがって、Android 4 以降では、バックグラウンド スレッドを使用してネットワーク操作を実行することが必須になります。

内部にネットワーク アクティビティを実行するコードを配置しdoInBacground()、すべての AsyncTask を使用しexecute()ます。

AsyncTask は次のようになります。

private class SendData extends AsyncTask<String, Integer, Void> {
     protected void doInBackground() {
// Create a new HttpClient and Post Header
HttpClient client = new DefaultHttpClient();
String postURL = ("http://19x.xx.xx.xxx/androidp2p/testform.php");
HttpPost post = new HttpPost(postURL);
try {
    // Add the data
    List<NameValuePair> pairs = new ArrayList<NameValuePair>(3);
    pairs.add(new BasicNameValuePair("keysendu", myBreadu));
    pairs.add(new BasicNameValuePair("keysendr", myBreadr));
    pairs.add(new BasicNameValuePair("keysendm", myBreadm));
    UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(pairs);
    post.setEntity(uefe);
    // Execute the HTTP Post Request
    HttpResponse response = client.execute(post);
    // Convert the response into a String
    HttpEntity resEntity = response.getEntity();
    if (resEntity != null) {
        Log.i("RESPONSE", EntityUtils.toString(resEntity));
    }
} catch (UnsupportedEncodingException uee) {
    uee.printStackTrace();
} catch (ClientProtocolException cpe) {
    cpe.printStackTrace();
} catch (IOException ioe) {
    ioe.printStackTrace();
}
        
 }

 protected void onProgressUpdate() {
    //called when the background task makes any progress
 }

  protected void onPreExecute() {
     //called before doInBackground() is started
 }
 protected void onPostExecute() {
     //called after doInBackground() has finished 
 }
  }

そして、あなたはそれをどこでも呼び出すことができますnew SendData().execute("");

于 2013-03-07T16:03:40.270 に答える