2013-10-05 37 views
0

我試圖創建一個程序,允許用戶使用下面的代碼發送HTTP POST到PHP腳本。當我點擊發送按鈕時,我得到一個android.os.NetworkOnMainThreadException。 (btnSend)。Android - LogCat給出了一個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; 
     } 




     } 

} 
+0

你能提供更多的信息嗎?像你在哪裏得到例外等 – meilke

+0

基本上,當我點擊發送按鈕,應用程序關閉,我得到在logcat上的follwing消息: threadid = 1:線程退出與未捕獲的異常 然後,我得到異常。 – nos4a2

+0

我知道我必須使用AsyncTask,所以我嘗試過。但我知道我做錯了。有什麼建議麼。 – nos4a2

回答

0

將您的doInBackground方法的代碼移動到protected void void doInBackground(void ... params)方法,它將工作。你必須使用AsyncTask類。這是鏈接到AsyncTask類。它也有如何使用示例代碼。

+0

做了你所說的。我應該如何執行http請求?我嘗試以這種方式創建類的實例: doThePost post =(doThePost)new doThePost()。execute(); 不工作 – nos4a2

+0

nvm,明白了!謝謝! – nos4a2

0

Android查殺已經運行5秒以上的進程+。 你必須使用AsyncTask。

+0

我讀過,我需要AsyncTask來做到這一點,但稱我爲初學者,我不知道如何在這裏使用AsyncTask。 – nos4a2

+0

我知道我必須使用AsyncTask,所以我嘗試過。但我知道我做錯了。有什麼建議麼。 – nos4a2

相關問題