0

次のコードを使用して、ユーザーが HTTP POST を PHP スクリプトに送信できるようにするプログラムを作成しようとしました。送信ボタンをクリックすると、android.os.NetworkOnMainThreadException が発生します。(ボタン送信)。

package com.naveed.post;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Creating HTTP client
        final HttpClient httpClient = new DefaultHttpClient();
        // Creating HTTP Post
        final HttpPost httpPost = new HttpPost("http://10.0.2.2/android_post/test.php");
        Button send = (Button)findViewById(R.id.btnSend);
        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                EditText message = (EditText)findViewById(R.id.textMessage);

                String msg = message.getText().toString();

                   // Building post parameters
                // key and value pair
                List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
                nameValuePair.add(new BasicNameValuePair("message", msg));

                // Url Encoding the POST parameters
                try {
                    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
                } catch (UnsupportedEncodingException e) {
                    // writing error to Log
                    e.printStackTrace();
                }

                // Making HTTP Request
                try {
                    HttpResponse response = httpClient.execute(httpPost);

                    // writing response to log
                    Log.d("Http Response:", response.toString());
                } catch (ClientProtocolException e) {
                    // writing exception to log
                    e.printStackTrace();
                } catch (IOException e) {
                    // writing exception to log
                    e.printStackTrace();

                }
            }
        });

    }
}

AsyncTask を使用する必要があることはわかっているので、試してみました。しかし、私はそれが間違っていることを知っています。助言がありますか。私のコードは以下の通りです:

package com.naveed.post;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Button send = (Button)findViewById(R.id.btnSend);
        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                 ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
                 EditText message = (EditText)findViewById(R.id.textMessage);

                    String msg = message.getText().toString();

                    nameValuePair.add(new BasicNameValuePair("message", msg));


            }
        });

    }

   class doThePost extends AsyncTask<Void, Void, Void>{

        protected Void doInBackground(ArrayList<NameValuePair>... nameValuePair) {
            // TODO Auto-generated method stub
            ArrayList<NameValuePair> nvPairs = nameValuePair[0];
             HttpClient httpClient = new DefaultHttpClient();
                // Creating HTTP Post
             HttpPost httpPost = new HttpPost("http://10.0.2.2/android_post/test.php");
                // Url Encoding the POST parameters
                try {
                    httpPost.setEntity(new UrlEncodedFormEntity(nvPairs));
                } catch (UnsupportedEncodingException e) {
                    // writing error to Log
                    e.printStackTrace();
                }

                // Making HTTP Request
                try {
                    HttpResponse response = httpClient.execute(httpPost);

                    // writing response to log
                    Log.d("hello", "done");
                    Log.d("Http Response:", response.toString());
                } catch (ClientProtocolException e) {
                    // writing exception to log
                    e.printStackTrace();
                } catch (IOException e) {
                    // writing exception to log
                    e.printStackTrace();

                }
                Log.d("hello", "done");
            return null;
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return null;
        }




        }

}
4

2 に答える 2

0

doInBackground メソッドのコードをprotected Void doInBackground(Void... params)メソッドに移動すると、機能します。また、AsyncTask クラスを使用する必要があります。AsyncTaskクラスへのリンクは次のとおりです。サンプルコードの使い方も掲載しています。

于 2013-10-05T16:53:12.397 に答える
0

5 秒以上実行されている Android 強制終了プロセス。AsyncTask を使用する必要があります。

于 2013-10-05T13:45:50.503 に答える