1

这是我的AsyncTask课:

公共类 JSONParser 扩展 AsyncTask {

    公共接口 MyCallbackInterface {
        public void onRequestComplete(JSONObject 结果);
    }

    私有 MyCallbackInterface mCallback;

    公共 JSONParser(MyCallbackInterface 回调) {
        mCallback = 回调;

        上下文上下文 = (上下文) 回调;
    }

    公共 JSONObject getJSONFromUrl(字符串 url){  

        // 发出 HTTP 请求
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpPost = new HttpGet(url);
        HttpResponse getResponse = null;

        最终的 HttpParams httpParameters = httpClient.getParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 10 * 10000);
        HttpConnectionParams.setSoTimeout (httpParameters, 10 * 10000);

        尝试 {
            getResponse = httpClient.execute(httpPost);
        } 捕捉(ClientProtocolException e2){
            e2.printStackTrace();
        } 捕捉(IOException e2){
            e2.printStackTrace();
        }

        最终 int statusCode = getResponse.getStatusLine().getStatusCode();

        如果(状态代码!= HttpStatus.SC_OK){
           Log.w(getClass().getSimpleName(),
              "错误" + statusCode + " for URL " + url);
           返回空值;
        }

        HttpEntity getResponseEntity = getResponse.getEntity();

        字符串 json = null;
        尝试 {
            json = EntityUtils.toString(getResponseEntity);
        } 捕捉(ParseException e1){
            e1.printStackTrace();
        } 捕捉(IOException e1){
            e1.printStackTrace();
        }

        JSONObject jObj = null;
        // 尝试将字符串解析为 JSON 对象
        尝试 {
            jObj = 新的 JSONObject(json);
        } 捕捉(JSONException e){
            Log.e("JSON Parser", "解析数据出错" + e.toString());
        }

        // 返回 JSON 字符串
        返回 obj;
    }

    @覆盖
    受保护的 JSONObject doInBackground(String...params) {
        字符串 url = 参数 [0];            
        返回 getJSONFromUrl(url);
    }

    @覆盖
    受保护的无效 onPostExecute(JSONObject 结果){

        mCallback.onRequestComplete(结果);

    }

}

我在 UI(类RegisterActivity extends Activity implements MyCallbackInterface)中得到 JSON 答案:

公共类 RegisterActivity 扩展 Activity 实现 MyCallbackInterface{
...
    @覆盖
    公共无效 onRequestComplete(JSONObject json) {
//租用解析并显示json
...

JSONParser从同一个 UI(类RegisterActivity extends Activity implements MyCallbackInterface)调用

JSONParser mJSONParser1 = new JSONParser(context111);
mJSONParser1.execute(SERVER_URL+"?method=registration&user="+user+"&pass="+pass+"®Id="+regId);

例外情况:

10-03 15:58:02.303: W/System.err(22414): java.net.SocketException: 连接超时
10-03 15:58:02.350: W/System.err(22414): at org.apache.harmony.luni.platform.OSNetworkSystem.read(Native Method)
10-03 15:58:02.366: W/System.err(22414): 在 dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:273)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:458)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-03 15:58:02.366: W/System.err(22414): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-03 15:58:02.366: W/System.err(22414): 在 com.androidhive.pushnotifications.JSONParser.getJSONFromUrl(JSONParser.java:72)
10-03 15:58:02.366: W/System.err(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:121)
10-03 15:58:02.366: W/System.err(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:1)
10-03 15:58:02.366: W/System.err(22414): 在 android.os.AsyncTask$2.call(AsyncTask.java:185)
10-03 15:58:02.366: W/System.err(22414): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
10-03 15:58:02.366: W/System.err(22414): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138)
10-03 15:58:02.366: W/System.err(22414): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
10-03 15:58:02.374: W/System.err(22414): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
10-03 15:58:02.374: W/System.err(22414): 在 java.lang.Thread.run(Thread.java:1019)
10-03 15:58:02.374: W/dalvikvm(22414): threadid=9: 线程以未捕获的异常退出 (group=0x40018560)
10-03 15:58:02.374:E/AndroidRuntime(22414):致命异常:AsyncTask #1
10-03 15:58:02.374: E/AndroidRuntime(22414): java.lang.RuntimeException: 执行 doInBackground() 时出错
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 android.os.AsyncTask$3.done(AsyncTask.java:200)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:125)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.lang.Thread.run(Thread.java:1019)
10-03 15:58:02.374:E/AndroidRuntime(22414):由:java.lang.NullPointerException 引起
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 com.androidhive.pushnotifications.JSONParser.getJSONFromUrl(JSONParser.java:81)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:121)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 com.androidhive.pushnotifications.JSONParser.doInBackground(JSONParser.java:1)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 android.os.AsyncTask$2.call(AsyncTask.java:185)
10-03 15:58:02.374: E/AndroidRuntime(22414): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
10-03 15:58:02.374: E/AndroidRuntime(22414): ... 4 更多

我可以访问服务器。它适用于三星 s2(android 4.1.2),但不适用于摩托罗拉(带有 android 2.3.3)。

任何想法都将受到欢迎。

我认为问题在于异步任务......但是......没有更多的帮助。

PP php 服务器向请求(php 日志)返回写入答案,但应用程序无法得到它。

4

2 回答 2

0

JSONParser mJSONParser1 = new JSONParser(context111); mJSONParser1.execute(SERVER_URL+"?method=registration&user="+user+"&pass="+pass+"®Id="+regId)错字还是直接剪切/粘贴?“Id=”位旁边有一些不寻常的字符。

而且你确实有导致空值的代码行,那么为什么它是空值(正如 tyczj 指出的那样)

于 2013-10-03T14:59:28.353 回答
0

上面的答案是正确的,但是为了安全起见,您应该使用 POST 而不是 GET

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("SERVER_URL");
httpPost.setEntity(new UrlEncodedFormEntity(params));

像这样设置参数

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("email", email));

GET vs POST here有很好的争论

于 2015-07-05T08:42:48.153 回答