繁体   English   中英

从Android将JSON对象发布到PHP服务器时无法识别错误

[英]Unable to identify error when posting JSON Object to PHP Server from android

我正在尝试将JSON对象发布到PHP服务器,其响应将显示在ListView中。 不幸的是,当发送JSON对象时,我的应用程序不断崩溃,我无法确定原因。

片段代码:

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * A fragment representing a list of Items.
 * <p/>
 * interface.
 */
public class vodFragment extends Fragment {

    // TODO: Customize parameter argument names
    private static final String ARG_COLUMN_COUNT = "column-count";
    // TODO: Customize parameters
    private int mColumnCount = 1;

    private static String value;

    String url = "http://192.168.43.149/twende/channelVOD.php";

/**
 * Mandatory empty constructor for the fragment manager to instantiate the
 * fragment (e.g. upon screen orientation changes).
 */
public vodFragment() {
}

// TODO: Customize parameter initialization
@SuppressWarnings("unused")
public static vodFragment newInstance(int columnCount) {
    vodFragment fragment = new vodFragment();

    Bundle args = new Bundle();
    args.putInt(ARG_COLUMN_COUNT, columnCount);
    fragment.setArguments(args);
    return fragment;


}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getArguments() != null) {
        mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
    }

    JSONObject channelInfo = new JSONObject();
    try {
        channelInfo.put("channelName", value);
        channelInfo.put("channelOwner", "dan");



    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    postJSONObject(url,channelInfo);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_vod_list, container, false);



    return view;
}

public static void setChannel(String channel){
   value = channel;
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

@Override
public void onDetach() {
    super.onDetach();
}

public static String postJSONObject(String myurl, JSONObject parameters) {
    HttpURLConnection conn = null;
    try {
        StringBuffer response = null;
        URL url = new URL(myurl);
        conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        OutputStream out = new BufferedOutputStream(conn.getOutputStream());
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
        writer.write(parameters.toString());
        writer.close();
        out.close();
        int responseCode = conn.getResponseCode();
        System.out.println("responseCode" + responseCode);
        switch (responseCode) {
            case 200:
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String inputLine;
                response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                return response.toString();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (conn != null) {
            try {
                conn.disconnect();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    return null;
}

}

并且收到的错误是:

android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1318)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:120)
    at com.android.okhttp.okio.Okio$2.read(Okio.java:136)
    at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
    at com.android.okhttp.okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
    at com.android.okhttp.internal.http.HttpConnection.isReadable(HttpConnection.java:155)
    at com.android.okhttp.Connection.isReadable(Connection.java:442)
    at com.android.okhttp.OkHttpClient$1.isReadable(OkHttpClient.java:93)
    at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:365)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:355)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:273)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:474)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:257)
    at twende.twendev0001.vodFragment.postJSONObject(vodFragment.java:111)
    at twende.twendev0001.vodFragment.onCreate(vodFragment.java:72)
    at android.support.v4.app.Fragment.performCreate(Fragment.java:2414)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)
    at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
    at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1078)
    at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:117)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2408)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:836)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:203)
    at android.app.ActivityThread.main(ActivityThread.java:6251)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

谁能帮助我确定错误原因?

谢谢

您正在尝试在主线程上进行网络活动。 使用AsyncTask解决此问题。 如果主线程上发生长时间的活动,Android将阻止执行,以保持UI响应。 因此,您必须创建一个单独的线程来执行网络活动。 可以使用AsyncTask有效地完成此操作

new AsyncTask<String, String, String> {
    protected String doInBackground(String... params) {

        // code to do network activity

        return result;
    }
    protected void onPostExecute(String result) {

        // code to do after the procedure is finished

    }    
    protected void onPreExecute() {

        // code to do before the procedure starts

    }
}.execute([params]);

参见https://developer.android.com/reference/android/os/AsyncTask

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM