Android 为什么我的应用程序在获取和解析JSON数据时强制关闭?

Android 为什么我的应用程序在获取和解析JSON数据时强制关闭?,android,json,android-listview,android-asynctask,android-adapter,Android,Json,Android Listview,Android Asynctask,Android Adapter,首先,我是个笨蛋。我可能没有正确地处理AsyncTask,但这就是我在这里的原因 我试图创建一个从JSON数据获取、解析和显示值的活动。现在我使用Twitter作为占位符,但我将使用Youtube的GData。我真的不太了解Android的JSON库或异步任务,所以这些是我寻找问题的第一个地方。我自己也找不到 注意:我在清单中有internet访问权限 这是我参加活动的班级。 public class MainActivity extends ListActivity { List&l

首先,我是个笨蛋。我可能没有正确地处理AsyncTask,但这就是我在这里的原因

我试图创建一个从JSON数据获取、解析和显示值的活动。现在我使用Twitter作为占位符,但我将使用Youtube的GData。我真的不太了解Android的JSON库或异步任务,所以这些是我寻找问题的第一个地方。我自己也找不到

注意:我在清单中有internet访问权限

这是我参加活动的班级。

public class MainActivity extends ListActivity {

    List<String> videos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        videos = new ArrayList<String>();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new LoadVideos().execute("http://twitter.com/statuses/user_timeline/zacpac2020.json");
    }

    private class LoadVideos extends AsyncTask<String, Integer, String> {

        @Override
        protected String doInBackground(String... params) {
            final ListView listview = (ListView) findViewById(R.id.listview);

            StringBuilder builder = new StringBuilder();
            HttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(params[0]);
            try {
                HttpResponse response = client.execute(httpGet);
                StatusLine statusLine = response.getStatusLine();
                int statusCode = statusLine.getStatusCode();
                if (statusCode == 200) {
                    HttpEntity entity = response.getEntity();
                    InputStream content = entity.getContent();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        builder.append(line);
                    }
                } else {
                    Log.e("JSON Parsing", "Failed to download the JSON file.");
                    System.err.println("Failed to download JSON file.");
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                System.err.println("ClientProtocolException in LoadVideos");
            } catch (IOException e) {
                e.printStackTrace();
                System.err.println("ClientProtocolException in LoadVideos");
            }

            String data = builder.toString();
            try {
                JSONArray jsonArray = new JSONArray(data);
                Log.i("Parse JSON", 
                        "Number of entries: " + jsonArray.length());
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    videos.add(jsonObject.toString());
                }
            } catch(Exception e) {
                e.printStackTrace();
            }

            final ArrayAdapter<String> arrayAdapter =      
                    new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1, videos);
            listview.setAdapter(arrayAdapter);

            return "All Done!";
        }
    }

}

看起来我让网络在主线程上下载了一些东西。但是我不认为我会…

因为您的活动是一个
列表活动
它给出了以下错误:

java.lang.RuntimeException:无法启动活动组件信息{com.aer.biblealive/com.aer.biblealive.MainActivity}:java.lang.RuntimeException:您的内容必须具有id属性为“android.R.id.list”的ListView

确保您的
R.layout.activity\u main
具有如下列表视图:

<ListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

重要的一位是
android:id
属性


您还可以将
扩展列表活动
更改为
扩展活动
,并自行处理
列表视图

列表视图.setAdapter(arrayAdapter)导致问题的行,所以在执行doInBackground方法时需要使用onpostexecute更新UIcomplete@user2246674-您正在查看日志中的最后一个错误吗?因为logcat输出中包含的同一活动的前几次运行中有很多错误(请注意,第一个错误是在最后一个之前的错误)。@user2246674-如果您想在自己的答案中解释问题的原因以及要更改的代码,请随时回答。但是,我相信这些错误来自用户已更正的上一次运行。您是正确的。这里我假设(耶!)只发布了相关的堆栈。。如果可以的话,我会反复投票支持这样的问题。@ianhanniballake我为额外的logcat错误感到抱歉,我直接从logcat复制并粘贴了它们。我点击了所有的按钮,大约有30个错误。我猜当你使用我的方法时,它复制了比我想的更多的东西。我现在真的感觉有点糟糕。很抱歉。@ZacCanoy-
android.R.id.list
,尽管在
ListActivity
中,您可以调用
getListView()
(请注意,还有一个
setListAdapter
辅助方法)。我建议您查看一下
列表活动
比常规的
活动
05-05 21:42:59.503: D/AndroidRuntime(20362): Shutting down VM
05-05 21:42:59.503: W/dalvikvm(20362): threadid=1: thread exiting with uncaught exception (group=0x41640930)
05-05 21:42:59.511: E/AndroidRuntime(20362): FATAL EXCEPTION: main
05-05 21:42:59.511: E/AndroidRuntime(20362): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.aer.biblealive/com.aer.biblealive.MainActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ActivityThread.access$600(ActivityThread.java:154)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1248)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.os.Looper.loop(Looper.java:137)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ActivityThread.main(ActivityThread.java:5235)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at java.lang.reflect.Method.invokeNative(Native Method)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at java.lang.reflect.Method.invoke(Method.java:511)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at dalvik.system.NativeStart.main(Native Method)
05-05 21:42:59.511: E/AndroidRuntime(20362): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ListActivity.onContentChanged(ListActivity.java:243)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:335)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.Activity.setContentView(Activity.java:1881)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at com.aer.biblealive.MainActivity.onCreate(MainActivity.java:41)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.Activity.performCreate(Activity.java:5104)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-05 21:42:59.511: E/AndroidRuntime(20362):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
05-05 21:42:59.511: E/AndroidRuntime(20362):    ... 11 more
<ListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>