【问题标题】:Android - Json Parsing - App Crashes [closed]Android - Json 解析 - 应用程序崩溃 [关闭]
【发布时间】:2014-06-22 12:39:17
【问题描述】:

我正在开发一个 Wetter 应用程序,首先我想测试解析 Json。 但此时我的应用程序崩溃了:

protected Void doInBackground(Void... arg0) {
            // Creating service handler class instance
            JsonParser jp = new JsonParser();

这里是孔代码:

  package com.example.wetter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {

        private ProgressDialog pDialog;

        private static String url = "My URL";

        private static final String TAG_CURRENT_CONDITION = "current_condition";
        private static final String TAG_HUMIDITY = "humidity";
        private static final String TAG_CLOUDCOVER = "cloudcover";
        TextView tv1;
        TextView tv2;


        JSONArray current_condition = null;


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            tv1 = (TextView) findViewById(R.id.textView1);
            tv2 = (TextView) findViewById(R.id.textView2);

            new GetWeather().execute();
        }

        /**
         * Async task class to get json by making HTTP call
         * */
        private class GetWeather extends AsyncTask<Void, Void, Void> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                // Showing progress dialog
                pDialog = new ProgressDialog(MainActivity.this);
                pDialog.setMessage("Please wait...");
                pDialog.setCancelable(false);
                pDialog.show();

            }

            @Override
            protected Void doInBackground(Void... arg0) {
                // Creating service handler class instance
                JsonParser jp = new JsonParser();

                // Making a request to url and getting response
                String jsonStr = jp.makeServiceCall(url, JsonParser.GET);

                Log.d("Response: ", "> " + jsonStr);

                if (jsonStr != null) {
                    try {
                        JSONObject jsonObj = new JSONObject(jsonStr);

                        // Getting JSON Array node
                        current_condition = jsonObj.getJSONArray(TAG_CURRENT_CONDITION);

                        // looping through All Contacts
                        for (int i = 0; i < current_condition.length(); i++) {
                            JSONObject c = current_condition.getJSONObject(i);

                            // Phone node is JSON Object
                            JSONObject current_condition = c.getJSONObject(TAG_CURRENT_CONDITION);
                            String humidity = current_condition.getString(TAG_HUMIDITY);
                            String cloudcover = current_condition.getString(TAG_CLOUDCOVER);


                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                } else {
                    Log.e("ServiceHandler", "Couldn't get any data from the url");
                }

                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                // Dismiss the progress dialog
                if (pDialog.isShowing())
                    pDialog.dismiss();

                tv1.setText(TAG_HUMIDITY + "%");
                tv2.setText(TAG_CLOUDCOVER + "%");


            }

        }

    }

这是 Json Parser.class:

package com.example.wetter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class JsonParser {

    static String response = null;
    public final static int GET = 1;
    public final static int POST = 2;

    public JsonParser() {

    }

    /**
     * Making service call
     * @url - url to make request
     * @method - http request method
     * */
    public String makeServiceCall(String url, int method) {
        return this.makeServiceCall(url, method, null);
    }

    /**
     * Making service call
     * @url - url to make request
     * @method - http request method
     * @params - http request params
     * */
    public String makeServiceCall(String url, int method,
            List<NameValuePair> params) {
        try {
            // http client
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpEntity httpEntity = null;
            HttpResponse httpResponse = null;

            // Checking http request method type
            if (method == POST) {
                HttpPost httpPost = new HttpPost(url);
                // adding post params
                if (params != null) {
                    httpPost.setEntity(new UrlEncodedFormEntity(params));
                }

                httpResponse = httpClient.execute(httpPost);

            } else if (method == GET) {
                // appending params to url
                if (params != null) {
                    String paramString = URLEncodedUtils
                            .format(params, "utf-8");
                    url += "?" + paramString;
                }
                HttpGet httpGet = new HttpGet(url);

                httpResponse = httpClient.execute(httpGet);

            }
            httpEntity = httpResponse.getEntity();
            response = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return response;

    }
}

感谢您的帮助。 对不起我的英语,我知道这很糟糕。 :D

这是我的日志

06-22 15:24:37.519: I/Process(16100): Sending signal. PID: 16100 SIG: 9
06-22 15:24:38.290: W/ApplicationPackageManager(17171): getCSCPackageItemText()
06-22 15:24:38.290: I/PersonaManager(17171): getPersonaService() name persona_policy
06-22 15:24:38.450: I/Adreno-EGL(17171): <qeglDrvAPI_eglInitialize:381>: EGL 1.4 QUALCOMM build:  (CL3869936)
06-22 15:24:38.450: I/Adreno-EGL(17171): OpenGL ES Shader Compiler Version: 17.01.11.SPL
06-22 15:24:38.450: I/Adreno-EGL(17171): Build Date: 01/17/14 Fri
06-22 15:24:38.450: I/Adreno-EGL(17171): Local Branch: 
06-22 15:24:38.450: I/Adreno-EGL(17171): Remote Branch: 
06-22 15:24:38.450: I/Adreno-EGL(17171): Local Patches: 
06-22 15:24:38.450: I/Adreno-EGL(17171): Reconstruct Branch: 
06-22 15:24:38.480: D/OpenGLRenderer(17171): Enabling debug mode 0
06-22 15:24:38.490: D/ProgressBar(17171): updateDrawableBounds: left = 0
06-22 15:24:38.490: D/ProgressBar(17171): updateDrawableBounds: top = 0
06-22 15:24:38.490: D/ProgressBar(17171): updateDrawableBounds: right = 144
06-22 15:24:38.490: D/ProgressBar(17171): updateDrawableBounds: bottom = 144
06-22 15:24:38.510: W/dalvikvm(17171): threadid=11: thread exiting with uncaught exception (group=0x41889da0)
06-22 15:24:38.530: E/AndroidRuntime(17171): FATAL EXCEPTION: AsyncTask #1
06-22 15:24:38.530: E/AndroidRuntime(17171): Process: com.example.wetter, PID: 17171
06-22 15:24:38.530: E/AndroidRuntime(17171): java.lang.RuntimeException: An error occured while executing doInBackground()
06-22 15:24:38.530: E/AndroidRuntime(17171):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.lang.Thread.run(Thread.java:841)
06-22 15:24:38.530: E/AndroidRuntime(17171): Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at com.example.wetter.JsonParser.makeServiceCall(JsonParser.java:70)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at com.example.wetter.JsonParser.makeServiceCall(JsonParser.java:34)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at com.example.wetter.MainActivity$GetWeather.doInBackground(MainActivity.java:65)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at com.example.wetter.MainActivity$GetWeather.doInBackground(MainActivity.java:1)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-22 15:24:38.530: E/AndroidRuntime(17171):    ... 4 more
06-22 15:24:38.530: E/AndroidRuntime(17171): Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at libcore.io.Posix.getaddrinfo(Native Method)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
06-22 15:24:38.530: E/AndroidRuntime(17171):    at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
06-22 15:24:38.530: E/AndroidRuntime(17171):    ... 19 more
06-22 15:24:38.530: E/AndroidRuntime(17171): Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
06-22 15:24:38.530: E/AndroidRuntime(17171):    ... 22 more
06-22 15:24:38.750: E/WindowManager(17171): android.view.WindowLeaked: Activity com.example.wetter.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42ab2160 V.E..... R......D 0,0-1026,288} that was originally added here
06-22 15:24:38.750: E/WindowManager(17171):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:457)
06-22 15:24:38.750: E/WindowManager(17171):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:267)
06-22 15:24:38.750: E/WindowManager(17171):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.Dialog.show(Dialog.java:288)
06-22 15:24:38.750: E/WindowManager(17171):     at com.example.wetter.MainActivity$GetWeather.onPreExecute(MainActivity.java:55)
06-22 15:24:38.750: E/WindowManager(17171):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
06-22 15:24:38.750: E/WindowManager(17171):     at android.os.AsyncTask.execute(AsyncTask.java:535)
06-22 15:24:38.750: E/WindowManager(17171):     at com.example.wetter.MainActivity.onCreate(MainActivity.java:40)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.Activity.performCreate(Activity.java:5426)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.ActivityThread.access$900(ActivityThread.java:161)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
06-22 15:24:38.750: E/WindowManager(17171):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-22 15:24:38.750: E/WindowManager(17171):     at android.os.Looper.loop(Looper.java:157)
06-22 15:24:38.750: E/WindowManager(17171):     at android.app.ActivityThread.main(ActivityThread.java:5356)
06-22 15:24:38.750: E/WindowManager(17171):     at java.lang.reflect.Method.invokeNative(Native Method)
06-22 15:24:38.750: E/WindowManager(17171):     at java.lang.reflect.Method.invoke(Method.java:515)
06-22 15:24:38.750: E/WindowManager(17171):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
06-22 15:24:38.750: E/WindowManager(17171):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
06-22 15:24:38.750: E/WindowManager(17171):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 在类加载过程中是否失败?因为实例化 JsonParser 应该这样做,所以没有复杂的初始化,无论是在字段上还是在 c'tor 本身中。
  • 请张贴你的日志
  • 我稍后会发布。

标签: java android json


【解决方案1】:

java.lang.SecurityException:权限被拒绝(缺少 INTERNET 权限?)

您需要在清单中声明的​​ INTERNET 权限:

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

【讨论】:

  • 你是对的 -.- 谢谢
猜你喜欢
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多