2013-05-01 37 views
5

Tôi đang cố gắng gửi một số dữ liệu đến trang web của mình. Khi nút được nhấn vào, dữ liệu cần phải được gửi đến các trang webCách gửi dữ liệu đến trang web bằng cách sử dụng ứng dụng android

nhưng tôi có một số lỗi khi tôi chạy chương trình

khi tôi nhấp vào nút báo này xuất hiện "không may ứng dụng đã dừng lại", sau đó nó thoát khỏi ứng dụng của tôi.

public class testInput extends Activity { 

Button Setbutton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 


    setContentView(R.layout.test_input_page); 

    Setbutton=(Button)findViewById(R.id.setbtn); 

Setbutton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
     testInput ti=new testInput(); 
      //Create the intent 



      ti.postData("Sent Data"); 


    }); 

} 

public void postData(String toPost) { 
    // Create a new HttpClient and Post Header 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://mysite.com/index.php"); 

    //This is the data to send 
    String MyName = toPost; //any data to send 

    try { 
    // Add your data 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("action", MyName)); 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    // Execute HTTP Post Request 

    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    String response = httpclient.execute(httppost, responseHandler); 

    //This is the response from a php application 
    String reverseString = response; 
    Toast.makeText(this, "response" + reverseString, Toast.LENGTH_LONG).show(); 

    } catch (ClientProtocolException e) { 
    Toast.makeText(this, "CPE response " + e.toString(), Toast.LENGTH_LONG).show(); 
    // TODO Auto-generated catch block 
    } catch (IOException e) { 
    Toast.makeText(this, "IOE response " + e.toString(), Toast.LENGTH_LONG).show(); 
    // TODO Auto-generated catch block 
    } 

    }//end postData() 

Đây là mã PHP của tôi.

<?php 

//code to reverse the string 

$reversed = strrev($_POST["action"]); 

echo $reversed; 

?> 

Tôi cũng được phép sử dụng internet trong ứng dụng của mình.

+0

bạn đã không đề cập đến các lỗi mà bạn đang nhận được. –

+0

Bạn có nhận được bất kỳ thứ gì hoạt động không? Nếu vậy xin vui lòng gửi để giúp tất cả mọi người ra ngoài. Cảm ơn! – jkw4703

Trả lời

3

Kể từ Android 3.x bạn không thể thực hiện các hoạt động mạng trong chuỗi chính. Bạn cần sử dụng AsyncTask hoặc chuỗi riêng biệt, nơi bạn có thể gọi phương thức postData của mình.

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

+0

Cảm ơn bạn, Bạn có thể giải thích thêm về nó Vì tôi mới phát triển Android – Tikitaka

+0

http://stackoverflow.com/a/9671602/527759 http://developer.android.com/reference/android/os/AsyncTask .html – httpdispatch

0

Dưới đây là một đoạn mã, hy vọng nó sẽ giúp bạn.

1) Một chức năng có thể mang theo dịch vụ http get

private String SendDataFromAndroidDevice() { 
    String result = ""; 

    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet getMethod = new HttpGet("your url + data appended"); 

     BufferedReader in = null; 
     BasicHttpResponse httpResponse = (BasicHttpResponse) httpclient 
       .execute(getMethod); 
     in = new BufferedReader(new InputStreamReader(httpResponse 
       .getEntity().getContent())); 

     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     while ((line = in.readLine()) != null) { 
      sb.append(line); 
     } 
     in.close(); 
     result = sb.toString(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

2) Một lớp mà kéo dài AsyncTask

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

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected String doInBackground(String... params) { 
     String result = SendDataFromAndroidDevice(); 
     return result; 
    } 

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

    @Override 
    protected void onPostExecute(String result) { 

     if (result != null && !result.equals("")) { 
      try { 
       JSONObject resObject = new JSONObject(result); 

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

3) Bên trong phương pháp onCreate của bạn

 @Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView("your layout"); 



    if ("check here where network/internet is avaliable") { 

     new HTTPdemo().execute(""); 
    } 

    } 

Mã đoạn mã do tôi cung cấp hoạt động theo cách sau,

1) thiết bị Android gửi URL + dữ liệu đến máy chủ

2) Server [nói PHP sử dụng] nhận được dữ liệu và đưa ra một sự thừa nhận

Bây giờ Bộ luật mà nên được viết ở phía máy khách (Android) được cung cấp cho bạn, phần sau của việc nhận dữ liệu đó tại máy chủ là

  • Máy chủ cần nhận dữ liệu
  • Thực hiện một chức năng ở phía máy chủ
  • Chức năng đó [dịch vụ web] sẽ được gọi bất cứ khi nào android sẽ đẩy URL + dữ liệu
  • Một khi bạn có dữ liệu, thao tác nó như bạn muốn
+0

Cảm ơn bạn Mã PHP của tôi có hữu ích cho phía máy chủ không? – Tikitaka

+0

Mã PHP hiện tại của tôi có hữu ích cho việc này để lấy dữ liệu không? – Tikitaka

2

sử dụng đoạn mã sau

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://yoursite.com/index.php"); 

String MyName = toPost; 

try 
{ 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
    nameValuePairs.add(new BasicNameValuePair("action", MyName)); 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

    HttpResponse response = httpclient.execute(httppost); 

    InputStream is = response.getEntity().getContent(); 

    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

    result = br.readLine(); 
    //This is the response from a php application 
    String reverseString = result; 
    Toast.makeText(this, "result" + reverseString, Toast.LENGTH_LONG).show(); 
} 
catch(Exception e) 
{ 
    Toast.makeText(this, ""+e, Toast.LENGTH_LONG).show(); 
} 
1
i hope this help u alloott 
package com.example.test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
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.ResponseHandler; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

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

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button but=(Button)findViewById(R.id.button1); 
    but.setOnClickListener(new View.OnClickListener() { 

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

     } 
    }); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
public void postData() { 
    // Create a new HttpClient and Post Header 
    class ss extends AsyncTask<Void, Void, String> 
    { 

    @Override 
    protected String doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     HttpClient httpclient = new DefaultHttpClient(); 
     String result = null; 
     HttpPost httppost = new HttpPost("http://www.techdoo.com/test.php"); 

     try 
     { 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
     nameValuePairs.add(new BasicNameValuePair("action", "fadeel")); 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 

     InputStream is = response.getEntity().getContent(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

     result = br.readLine(); 
     //This is the response from a php application 
     String reverseString = result; 
     EditText edit1=(EditText)findViewById(R.id.editText1); 
     edit1.setText(result); 
     // Toast.makeText(this, "result" + reverseString, Toast.LENGTH_LONG).show(); 
     } 
     catch(Exception e) 
     { 
     //Toast.makeText(this, ""+e, Toast.LENGTH_LONG).show(); 
     } 
     return result; 
    } 
    @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
     if(result==null) 
     { 
      Toast.makeText(getApplicationContext(), "not ok", Toast.LENGTH_LONG).show(); 
     } 
     else 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 

      super.onPostExecute(result); 
     } 

    } 
    ss s=new ss(); 
    s.execute(null,null,null); 
} 

}

+0

FYI - Đã thử phương thức postData() trong mã của tôi và theo các phương pháp 2015-06-14 và HttpResponse, HttpClient và NameValuePair không được chấp nhận. Tôi không thể làm cho nó hoạt động nhưng điều đó đơn giản chỉ vì tôi đã quên việc bổ sung cho phép manifest của android.permission.INTERNET. Mã này hoạt động. – raddevus

Các vấn đề liên quan