GVKun编程网logo

在 Android 中发送 POST 数据(android发送post请求)

11

对于想了解在Android中发送POST数据的读者,本文将提供新的信息,我们将详细介绍android发送post请求,并且为您提供关于AndroidAsyncTask通过httpPost发送数据、An

对于想了解在 Android 中发送 POST 数据的读者,本文将提供新的信息,我们将详细介绍android发送post请求,并且为您提供关于Android AsyncTask通过http Post发送数据、Android Handler类 发送消息-post()和postDelay(), Looper讲解、Android Studio – 使用依赖于另一个Android库的Android库构建Android项目、Android Studio在消息中发送消息多个字符串的有价值信息。

本文目录一览:

在 Android 中发送 POST 数据(android发送post请求)

在 Android 中发送 POST 数据(android发送post请求)

我对 PHP、JavaScript 和许多其他脚本语言有经验,但我对 Java 或 Android 没有太多经验。

我正在寻找一种将 POST 数据发送到 PHP 脚本并显示结果的方法。

答案1

小编典典

注意(2020 年 10 月):以下答案中使用的 AsyncTask 在 Android API 级别 30 中已弃用。请参阅
官方文档或此博客文章以获取更多更新示例

更新(2017 年 6 月)适用于 Android 6.0+ 的答案。

    public class CallAPI extends AsyncTask<String, String, String> {        public CallAPI(){            //set context variables if required        }        @Override        protected void onPreExecute() {            super.onPreExecute();        }         @Override         protected String doInBackground(String... params) {            String urlString = params[0]; // URL to call            String data = params[1]; //data to post            OutputStream out = null;            try {                URL url = new URL(urlString);                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();                out = new BufferedOutputStream(urlConnection.getOutputStream());                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));                writer.write(data);                writer.flush();                writer.close();                out.close();                urlConnection.connect();            } catch (Exception e) {                System.out.println(e.getMessage());            }        }    }

原始答案(2010 年 5 月)

注意:此解决方案已过时。 它仅适用于最高 5.1 的 Android 设备。Android 6.0 及更高版本不包括此答案中使用的 Apache
http 客户端。

来自 Apache Commons 的 Http Client 是必经之路。它已经包含在android中。这是一个如何使用它进行 HTTP Post
的简单示例。

public void postData() {    // Create a new HttpClient and Post Header    HttpClient httpclient = new DefaultHttpClient();    HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");    try {        // Add your data        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);        nameValuePairs.add(new BasicNameValuePair("id", "12345"));        nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi"));        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));        // Execute HTTP Post Request        HttpResponse response = httpclient.execute(httppost);    } catch (ClientProtocolException e) {        // TODO Auto-generated catch block    } catch (IOException e) {        // TODO Auto-generated catch block    }}

Android AsyncTask通过http Post发送数据

Android AsyncTask通过http Post发送数据

我有这个脚本.

我已经经历了堆栈溢出问题的许多变化,并使用解决方案尝试构建知识来做到这一点,但它似乎每次都失败,有人可以帮忙吗?

public class Main extends Activity implements OnClickListener {

    private EditText value;
    private Button btn;
    private ProgressBar pb;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        value = (EditText) findViewById(R.id.editText1);
        btn = (Button) findViewById(R.id.button1);
        pb = (ProgressBar) findViewById(R.id.progressBar1);
        pb.setVisibility(View.GONE);
        btn.setonClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onClick(View v) {
        // Todo Auto-generated method stub
        if (value.getText().toString().length() < 1) {
            // out of range
            Toast.makeText(this, "please enter something", Toast.LENGTH_LONG)
                    .show();
        } else {
            pb.setVisibility(View.VISIBLE);
            new MyAsyncTask().execute("hey");
        }

    }

    private class MyAsyncTask extends AsyncTask<String, Integer, Double> {

        @Override
        protected Double doInBackground(String... params) {
            // Todo Auto-generated method stub
            postData(params[0]);
            return null;
        }

        protected void onPostExecute(Double result) {
            pb.setVisibility(View.GONE);
            Toast.makeText(getApplicationContext(), "command sent",
                    Toast.LENGTH_LONG).show();
        }

        protected void onProgressUpdate(Integer... progress) {
            pb.setProgress(progress[0]);
        }

        public void postData(String valueIWantToSend) {
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(
                    "http://users.aber.ac.uk/bym1/group/androidto.PHP");

            try {
                // Add your data
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("myHttpData",
                        valueIWantToSend));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                // Execute HTTP Post Request
                HttpResponse response = httpclient.execute(httppost);

            } catch (ClientProtocolException e) {
                // Todo Auto-generated catch block
            } catch (IOException e) {
                // Todo Auto-generated catch block
            }
        }   
    }
}

我在网上找到了这个代码,我只是想让它工作,所以我有一个工作原型来解决并构建我自己的但我一直在我的日志文件中得到这个:

    01-28 22:30:07.030: W/dalvikvm(27142): threadid=11: thread exiting with uncaught exception (group=0x40bc2498)
01-28 22:30:07.030: E/test(27142): Exception
01-28 22:30:07.060: E/AndroidRuntime(27142): FATAL EXCEPTION: AsyncTask #1
01-28 22:30:07.060: E/AndroidRuntime(27142): java.lang.RuntimeException: An error occured while executing doInBackground()
01-28 22:30:07.060: E/AndroidRuntime(27142):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.lang.Thread.run(Thread.java:856)
01-28 22:30:07.060: E/AndroidRuntime(27142): Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.conn.DefaultClientConnectionoperator.openConnection(DefaultClientConnectionoperator.java:137)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at com.example.httpasync.Main$MyAsyncTask.postData(Main.java:98)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at com.example.httpasync.Main$MyAsyncTask.doInBackground(Main.java:70)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at com.example.httpasync.Main$MyAsyncTask.doInBackground(Main.java:1)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-28 22:30:07.060: E/AndroidRuntime(27142):    ... 5 more
01-28 22:30:07.060: E/AndroidRuntime(27142): Caused by: libcore.io.GaiException: getaddrinfo Failed: EAI_NODATA (No address associated with hostname)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at libcore.io.Posix.getaddrinfo(Native Method)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
01-28 22:30:07.060: E/AndroidRuntime(27142):    at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
01-28 22:30:07.060: E/AndroidRuntime(27142):    ... 19 more
01-28 22:30:07.060: E/AndroidRuntime(27142): Caused by: libcore.io.ErrnoException: getaddrinfo Failed: EACCES (Permission denied)
01-28 22:30:07.060: E/AndroidRuntime(27142):    ... 22 more

表现

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.httpasync"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.httpasync.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

互联网权限设置,我已查找异常,但答案似乎与我的代码,任何想法无关?

解决方法:

线索在logcat中:

Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)

您在AndroidManifest中缺少android.permission.INTERNET权限.添加此行:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

略低于:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

Android Handler类 发送消息-post()和postDelay(), Looper讲解

Android Handler类 发送消息-post()和postDelay(), Looper讲解

 

https://blog.csdn.net/weixin_41101173/article/details/79701832

 

首先,post和postDelay都是Handler的方法,用以在子线程中发送Runnable对象的方法;

其次,Android中post()方法可以直接在非UI线程中更新UI,不同与Handelr的Send类方法,需要进行切换;

最后,两个方法在实现UI线程事件的时间上有所区别,postDelayed()方法用以延期执行,post则是立即执行;

(2)Handler类的post类方法和send类方法联系与区别

①post类方法,以匿名内部类的形式发送Runnable对象,在Runnable对象重写的run()方法中直接对UI进行更新;

new Thread(new Runnable() {
@Override
public void run() {
/**
耗时操作
*/
handler.post(new Runnable() {
@Override
public void run() {
/**
更新UI
*/
}
});
}
}).start();
---------------------
作者:Chin_style
来源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版权声明:本文为博主原创文章,转载请附上博文链接!

三种切回主线程的实例:

final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
// 素描算法处理 耗时操作
final Bitmap bitmap1 = SketchUtil.testGaussBlur(finalBitmap,1,1);
final Bitmap bitmap2 = SketchUtil.testGaussBlur(finalBitmap,10,10);
final Bitmap bitmap3 = SketchUtil.testGaussBlur(finalBitmap,20,20);

// 三种切回主线程更新UI的方法
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap1); // 素描图
}
});

runOnUiThread(new Runnable() {
@Override
public void run() {
orignView.setImageBitmap(bitmap2); // 素描图
}
});

handler.post(new Runnable() {
@Override
public void run() {
threeView.setImageBitmap(bitmap3); // 素描图
}
});
}
}).start();
---------------------
作者:Chin_style
来源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版权声明:本文为博主原创文章,转载请附上博文链接!

 

注意:使用handler方法切回主线程时,注意handler的实例化要放在主线程中,而不能在新开的子线程中,否则报错:

RuntimeException: Can''t create handler inside thread that has not called Looper.prepare()

这是因为,Handler在哪里创建,就获得哪里的Looper。主线程创建的Handler,即默认使用主线程的Looper。

常见常用的post()类方法汇总:

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

②send类方法,比如sendMessage()方法,使用该方法发送构造好的Message,然后用Handler的handleMessage()方法接收发送出来的消息,在方法中对UI进行更新;

private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) { //判断标志位
case 1:
/**
获取数据,更新UI
*/
break;
}
}
};


public class WorkThread extends Thread {

@Override
public void run() {
super.run();
/**
耗时操作
*/

//从全局池中返回一个message实例,避免多次创建message(如new Message)
Message msg =Message.obtain();
msg.obj = data;
msg.what=1; //标志消息的标志
handler.sendMessage(msg);
}
}
常见常用的send类方法汇总:
---------------------
作者:Chin_style
来源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版权声明:本文为博主原创文章,转载请附上博文链接!

 

常见常用的send类方法汇总:

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

分析:谷歌为Android系统提供了一系列的post类方法用以发送Runnable对象,又提供了一系列的send类方法用以发送Message对象,其实二者并不矛盾也不重复,打开post类方法的源码,就会发现最终发送的Runnable对象也会转变成Message对象进行发送。谷歌提供两类方法应该是分别处理不同的场景,发送的消息较为复杂时,且每种消息对应一种UI的更新时选择使用send类方法;而当子线程中只发出一种消息时,则直接使用post方法发送消息,且直接在post方法的内部实现UI的更新。

(3)Message的构造

public final class Message implements Parcelable {
public int what;
public int arg1;
public int arg2;
public Object obj;
...
}
Message类中有这几个成员变量描述消息,其中what是我们定义的消息码,为了让接收者能知道消息是关于什么的。arg1和arg2用于发送一些integer类型的值。obj用于传输任意类型的值。
---------------------
作者:Chin_style
来源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版权声明:本文为博主原创文章,转载请附上博文链接!

 

⑦Looper的工作原理:Looper在Android的消息机制中扮演着消息循环的角色,具体来说就是它会不停地从MessageQueue中查看是否有新消息,如果有新消息就会立刻处理,否则就一直阻塞在那里。注意关注一些重要的Looper的方法:

Looper.prepare()-为当前线程创建一个Looper;
Looper.loop()-开启消息循环,只有调用该方法,消息循环系统才会开始循环;
Looper.prepareMainLooper()-为主线程也就是ActivityThread创建Looper使用;
Looper.getMainLooper()-通过该方法可以在任意地方获取到主线程的Looper;
Looper.quit() Looper.quitSafely()-退出Looper,自主创建的Looper建议在不使用的时候退出
⑧ActivityThread主线程通过ApplicationThread和AMS进行进程间通信
---------------------
作者:Chin_style
来源:CSDN
原文:https://blog.csdn.net/weixin_41101173/article/details/79701832
版权声明:本文为博主原创文章,转载请附上博文链接!

Android Studio – 使用依赖于另一个Android库的Android库构建Android项目

Android Studio – 使用依赖于另一个Android库的Android库构建Android项目

我需要使用Gradle构建一个依赖于Android库项目A的Android项目,该项目取决于另一个Android库项目B.

到目前为止,我有以下内容:

Android项目:

的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android'

dependencies {
    compile project(':LibA')
}

android {
    compileSdkVersion 7
    buildToolsversion "17.0.0"
}

manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cyborg.template"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="7" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name="com.cyborg.template.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Android库A:

的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

dependencies {
    compile project(':LibB')
}


android {
    compileSdkVersion 7
    buildToolsversion "17.0.0"
} 

manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.lib.project.a"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk
            android:minSdkVersion="7"
            android:targetSdkVersion="7"/>

</manifest>

Android库B:

的build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

android {
    compileSdkVersion 7
    buildToolsversion "17.0.0"
} 

manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.lib.project.b"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk
            android:minSdkVersion="7"
            android:targetSdkVersion="7"/>

</manifest>

在尝试构建Android项目时,Android studio报告了以下错误:

Gradle: Execution Failed for task ':LibA:processDebugManifest'.
  > Manifest merging Failed. See console for more info.

那个控制台在哪里我想搜索有关错误的更多信息?

我发现了一些关于这个错误的问题,但它似乎与我的情况不一样.

启示?

谢谢,
亚当.

解决方法:

该库的清单文件当前必须具有< application />节点,即使它是空的.

这是我们将在某些时候删除的限制,但现在,只需添加它.

Android Studio在消息中发送消息多个字符串

Android Studio在消息中发送消息多个字符串

如果您想连接这三种方法,例如“你好,我是保罗,我的生日isDateTime”, 您可以使用StringBuilder:

    StringBuilder sb = new StringBuilder();
    sb.append(message1);
    sb.append(message2);
    sb.append(message3);
    SmsManager.getDefault().sendTextMessage(phone,null,sb.toString(),null);

关于在 Android 中发送 POST 数据android发送post请求的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Android AsyncTask通过http Post发送数据、Android Handler类 发送消息-post()和postDelay(), Looper讲解、Android Studio – 使用依赖于另一个Android库的Android库构建Android项目、Android Studio在消息中发送消息多个字符串的相关信息,请在本站寻找。

本文标签: