【问题标题】:Java/Android App unexpectedly closing / POSTing to serverJava/Android 应用程序意外关闭/发布到服务器
【发布时间】:2014-03-20 18:17:30
【问题描述】:

我在 Eclipse 中没有任何错误或警告,而且我对 Android 编程完全陌生,所以我什至不知道从哪里开始。

我的应用程序只是一个简单的表单,我需要在线发布到 php 脚本。

这是我的主要 Activity 减去导入的大部分内容。我没有将它设置为对返回值或任何其他内容执行任何操作,TBH 我什至不知道如果它确实在其他方面工作会发生什么比我的数据库中的数据.. 但是我的应用程序根本没有调用 PHP 脚本。

根据我在 Google 中找到的内容,我尝试过 -添加支持库 - 将目标 sdk 版本从 19 更改为 18

请问,我做错了什么?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_apply);

    subm = (Button) findViewById(R.id.button1);
    fname = (EditText) findViewById(R.id.editText1);
    lname = (EditText) findViewById(R.id.editText2);
    addr = (EditText) findViewById(R.id.editText3);
    city = (EditText) findViewById(R.id.editText4);
    state = (EditText) findViewById(R.id.editText5);
    zip = (EditText) findViewById(R.id.editText6);
    phone = (EditText) findViewById(R.id.editText7);
    dob = (EditText) findViewById(R.id.editText8);
    email = (EditText) findViewById(R.id.editText9);
    ssn = (EditText) findViewById(R.id.editText10);

    subm.setOnClickListener(
    new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            try{

                String httpsURL = "https://example.com/apis/submit_credit_application.php";

                String query = "fname="+URLEncoder.encode(fname.getText().toString(),"UTF-8"); 
                query += "&lname="+URLEncoder.encode(lname.getText().toString(),"UTF-8");
                query += "&addr="+URLEncoder.encode(addr.getText().toString(),"UTF-8");
                query += "&city="+URLEncoder.encode(city.getText().toString(),"UTF-8");
                query += "&state="+URLEncoder.encode(state.getText().toString(),"UTF-8");
                query += "&zip="+URLEncoder.encode(zip.getText().toString(),"UTF-8");
                query += "&phone="+URLEncoder.encode(phone.getText().toString(),"UTF-8");
                query += "&dob="+URLEncoder.encode(dob.getText().toString(),"UTF-8");
                query += "&email="+URLEncoder.encode(email.getText().toString(),"UTF-8");
                query += "&ssn="+URLEncoder.encode(ssn.getText().toString(),"UTF-8");

                URL myurl = new URL(httpsURL);
                HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
                con.setRequestMethod("POST");

                con.setRequestProperty("Content-length", String.valueOf(query.length())); 
                con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
                con.setDoOutput(true); 
                con.setDoInput(true); 

                DataOutputStream output = new DataOutputStream(con.getOutputStream());  
                output.writeBytes(query);
                output.close();


            }catch(IOException e){

                Toast.makeText(
                    getApplicationContext(),
                    (CharSequence) e, 
                    Toast.LENGTH_LONG
                ).show();

            }

        }
    });
}

here's a Pastebin with my logcat

【问题讨论】:

  • 你的 logCat 里有什么东西吗?
  • NetworkOnMainThread 异常。网络调用需要在 android 2.3 之外的不同线程中进行
  • @user2310289 我用我的 logcat 在底部添加了一个 pastebin..
  • 确认@Peshal 是正确的

标签: java android post https


【解决方案1】:

正如您的错误所说,您无法在主线程上运行网络任务。 AsyncTasks 适用于运行您不想阻塞主线程的短任务。 链接到谷歌文档。 http://developer.android.com/reference/android/os/AsyncTask.html

// This class is just added somewhere in your main activity, like a function.
 private class PostFormTask extends AsyncTask<String, Integer, Long> {

     protected Long doInBackground(String... queryDetails) {

     try{

            String httpsURL = "https://example.com/apis/submit_credit_application.php";

            String query = "fname="+URLEncoder.encode(queryDetails[0],"UTF-8"); 
            query += "&lname="+URLEncoder.encode(queryDetails[1],"UTF-8");
            query += "&addr="+URLEncoder.encode(queryDetails[2],"UTF-8");
            // Keep adding to your query but instead of getting your details
            // from the textview they are in the queryDetails array.


            URL myurl = new URL(httpsURL);
            HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
            con.setRequestMethod("POST");

            con.setRequestProperty("Content-length", String.valueOf(query.length())); 
            con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
            con.setDoOutput(true); 
            con.setDoInput(true); 

            DataOutputStream output = new DataOutputStream(con.getOutputStream());  
            output.writeBytes(query);
            output.close();


        }catch(IOException e){

            Toast.makeText(
                getApplicationContext(),
                (CharSequence) e, 
                Toast.LENGTH_LONG
            ).show();

        }
         return false
     }

     protected void onPostExecute(Long result) {

     }
 }

然后在你的 onClick 事件上就可以了。

new PostFormTask().execute(fname.getText().toString(),
                                    lname.getText().toString() );
// just send your form details to your task here, you will want to add all your details 
// from your above code.

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    好的!因为你要你两分。 Here 是一个很好的教程,我在 Andorid 中使用 AsyncTask 调用 json Web 服务。基本上 AsyncTask 会创建一个可以进行网络操作的新线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多