Android OutputStream os = conn.getOutputStream();应用程序崩溃

标签 android

大家好,我想了解如何使用 Android 制作一个简单的帖子,这是我的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // url where the data will be posted
    Button clickButton = (Button) findViewById(R.id.button);
    clickButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            try {
                URL url = new URL("http://www.macrumors.com/share.php");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                //HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);

                Uri.Builder builder = new Uri.Builder()
                        .appendQueryParameter("name", "paramValue1")
                        .appendQueryParameter("email", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="88f8e9fae9e5dee9e4fdedbac8f1e9e0e7e7a6ebe7e5" rel="noreferrer noopener nofollow">[email protected]</a>")
                        .appendQueryParameter("storytitle", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d2a2b3a0b3bf84b3bea7b7e092abb3babdbdfcb1bdbf" rel="noreferrer noopener nofollow">[email protected]</a>")
                        .appendQueryParameter("story", "paramValue1")
                        .appendQueryParameter("username", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1c1d0c3d0dce7d0ddc4d483f1c8d0d9dede9fd2dedc" rel="noreferrer noopener nofollow">[email protected]</a>")
                        .appendQueryParameter("submit", "submit");


                String query = builder.build().getEncodedQuery();

                OutputStream os = conn.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(query);
                writer.flush();
                writer.close();
                os.close();

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

我不确定我做错了什么,我做了很多搜索来找出如何制作一个简单的帖子,并且正在尽力
此时代码似乎崩溃了< br/>

OutputStream os = conn.getOutputStream();

日志猫

Device driver API version: 10
    User space API version: 10
08-18 23:37:33.038  26003-26003/httpp.myapplication D/﹕ mali: REVISION=Linux-r2p4-02rel0 BUILD_DATE=Thu Oct 25 08:43:05 KST 2012
08-18 23:37:33.068  26003-26003/httpp.myapplication D/OpenGLRenderer﹕ Enabling debug mode 0
08-18 23:37:35.648  26003-26003/httpp.myapplication W/System.err﹕ android.os.NetworkOnMainThreadException
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
08-18 23:37:35.653  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-18 23:37:35.658  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
08-18 23:37:35.658  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
08-18 23:37:35.658  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
08-18 23:37:35.658  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
08-18 23:37:35.658  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
08-18 23:37:35.658  26003-26003/httpp.myapplication W/System.err﹕ at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at httpp.myapplication.MainActivity$1.onClick(MainActivity.java:52)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at android.view.View.performClick(View.java:4232)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at android.view.View$PerformClick.run(View.java:17298)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:615)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4921)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
08-18 23:37:35.663  26003-26003/httpp.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
08-18 23:37:35.668  26003-26003/httpp.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
08-18 23:37:35.668  26003-26003/httpp.myapplication W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
08-18 23:37:58.673  26003-26003/httpp.myapplication W/IInputConnectionWrapper﹕ getSelectedText on inactive InputConnection
08-18 23:37:58.673  26003-26003/httpp.myapplication W/IInputConnectionWrapper﹕ setComposingText on inactive InputConnection
08-18 23:37:58.673  26003-26003/httpp.myapplication W/IInputConnectionWrapper﹕ getExtractedText on inactive InputConnection
08-18 23:56:40.378  26003-26006/httpp.myapplication D/dalvikvm﹕ GC_CONCURRENT freed 362K, 16% free 9613K/11335K, paused 10ms+1ms, total 42ms

最佳答案

应用程序抛出NetworkOnMainThreadException,这意味着您不应在主线程中执行网络相关代码。这些代码会阻塞 UI。为了防止这种情况发生,您可以使用AsyncTask来执行网络相关代码。

这里是一个例子,创建一个新类:

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

    @Override
    protected Void doInBackground(Void... params) {
        try {
            URL url = new URL("http://www.macrumors.com/share.php");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("name", "paramValue1")
                    .appendQueryParameter("email", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="344455465559625558415106744d555c5b5b1a575b59" rel="noreferrer noopener nofollow">[email protected]</a>")
                    .appendQueryParameter("storytitle", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4d3d2c3f2c201b2c2138287f0d342c252222632e2220" rel="noreferrer noopener nofollow">[email protected]</a>")
                    .appendQueryParameter("story", "paramValue1")
                    .appendQueryParameter("username", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="32425340535f64535e475700724b535a5d5d1c515d5f" rel="noreferrer noopener nofollow">[email protected]</a>")
                    .appendQueryParameter("submit", "submit");


            String query = builder.build().getEncodedQuery();

            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            writer.write(query);
            writer.flush();
            writer.close();
            os.close();

            conn.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

public void onClick(View v)中,执行new NetworkAsyncTask().execute();

关于Android OutputStream os = conn.getOutputStream();应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32083883/

相关文章:

java - 创建自定义 Android 通知而不使用 RemoteView

android - 图像不适合圆形 ImageView

Android 相当于 ios devicecheck

android - ionic 2 : How can I get console messages from android device

android - 如何获取图像大小以便我可以在 android 底部编辑文本?

java - 如何将jar文件转换成apk?

android - 如何防止 ScrollView 拦截其背后 View 的点击/触摸事件?

iphone - 如何通过媒体查询区分 Android 和 iPad?

Android volley - 当所有请求完成时获取回调

android - 从网页重定向到手机应用程序中的页面