【问题标题】:JSON to parse data into android applicationJSON 将数据解析到 android 应用程序中
【发布时间】:2014-04-07 03:41:00
【问题描述】:

我正在尝试将 JSON 解析数据到 android。

我无法理解我的错误是什么。

我也是java和android的初学者。

这段代码不难,你不会无聊。

我的错误和代码如下所示:

04-07 05:19:02.305: E/AndroidRuntime(19599): FATAL EXCEPTION: main
04-07 05:19:02.305: E/AndroidRuntime(19599): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.buet_parsing/com.example.buet_parsing.MainActivity}: java.lang.NullPointerException
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.os.Looper.loop(Looper.java:137)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.ActivityThread.main(ActivityThread.java:5041)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at java.lang.reflect.Method.invokeNative(Native Method)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at java.lang.reflect.Method.invoke(Method.java:511)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at dalvik.system.NativeStart.main(Native Method)
04-07 05:19:02.305: E/AndroidRuntime(19599): Caused by: java.lang.NullPointerException
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.widget.ListView.setAdapter(ListView.java:462)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at com.example.buet_parsing.MainActivity.onCreate(MainActivity.java:46)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.Activity.performCreate(Activity.java:5104)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-07 05:19:02.305: E/AndroidRuntime(19599):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-07 05:19:02.305: E/AndroidRuntime(19599):    ... 11 more
04-07 05:19:11.135: I/Process(19599): Sending signal. PID: 19599 SIG: 9

主要活动:

package com.example.buet_parsing;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.ls.LSInput;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;

public class MainActivity extends Activity {

    ListView lv;
    CustomAdapter adapter;

    String urlString="http://cricscore-api.appspot.com/csa";
    ArrayList<ListIteam> allNews;

   AlertDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=(ListView)findViewById(R.id.list);

        adapter=new CustomAdapter(this, allNews);
        lv.setAdapter(adapter);


        DownloadTask download=new DownloadTask();

        Log.v(getClass().getSimpleName(), "Loading data.......");

        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setMessage("Loading data..");
        builder.setView(new ProgressBar(this));
        progressDialog=builder.create();
        progressDialog.show();


        download.execute();




    }


    class DownloadTask extends AsyncTask<Void, Void, String>{

        @Override
        protected String doInBackground(Void... params) {

          String result=null;

          try {
              HttpClient client=new DefaultHttpClient();
          HttpGet get=new HttpGet(urlString);
          HttpResponse response=client.execute(get);

          if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){

              InputStream in=response.getEntity().getContent();
              BufferedReader reader=new BufferedReader(new InputStreamReader(in));
              String line=reader.readLine();
              Log.v(getClass().getSimpleName(), line);

             return line; 
          }


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

            return result;
        }

        @Override
        protected void onPostExecute(String result) {

            progressDialog.dismiss();

            try {

                JSONArray array=new JSONArray(result);
                for (int i = 0; i < result.length(); i++) {
                    JSONObject object=array.getJSONObject(i);
                    String team1=object.getString("t1");
                    String team2=object.getString("t2");
                    ListIteam ls=new ListIteam(team1, team2);
                    allNews.add(ls);

                    adapter.notifyDataSetChanged();
                }


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


        }



    }


}

自定义适配器:

package com.example.buet_parsing;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class CustomAdapter extends ArrayAdapter<ListIteam>{

    Activity context;
    ArrayList<ListIteam> ls;

    public CustomAdapter(Activity context, ArrayList<ListIteam> ls) {
        super(context, R.layout.adapter_layout, ls);
      this.context=context;
      this.ls=ls;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
          View view=convertView;

          LayoutInflater inflat=context.getLayoutInflater();
          view=inflat.inflate(R.layout.adapter_layout, null, false);

          TextView txtTeam1=(TextView)view.findViewById(R.id.team1);
          TextView txtTeam2=(TextView)view.findViewById(R.id.team2); 

          ListIteam l=ls.get(position);
          txtTeam1.setText(l.getTeam1());
          txtTeam2.setText(l.getTeam2());


        return view;
    }



}

列表项:

package com.example.buet_parsing;

public class ListIteam {

    String team1;
    String team2;

    public ListIteam(String team1, String team2) {
        super();
        this.team1 = team1;
        this.team2 = team2;
    }

    public String getTeam1() {
        return team1;
    }

    public void setTeam1(String team1) {
        this.team1 = team1;
    }

    public String getTeam2() {
        return team2;
    }

    public void setTeam2(String team2) {
        this.team2 = team2;
    }

    @Override
    public String toString() {
        return "ListIteam [team1=" + team1 + ", team2=" + team2 + "]";
    }




}

【问题讨论】:

  • 按照@Hariharan 的说法。它应该可以解决您的问题,因为它在日志中提到列表视图必须有一个带有 android.R.id.list 的 id,这可以通过将 id 作为 @android:id/list 在 xml 中解决,因为您扩展了 ListActivity。
  • @Hariharan 的解决方案看起来非常适合这个问题。请将答案标记为已接受,以便可以关闭问题
  • 我编辑我的问题请看这个

标签: android json android-parser


【解决方案1】:

当您在 oncreate 中为列表视图设置适配器时,allNews 为 null,因此请初始化 allNews 替换ArrayList&lt;ListIteam&gt; allNews=new ArrayList&lt;ListIteam&gt;;

【讨论】:

    【解决方案2】:

    当您扩展 ListActivity 时,您需要有一个 ID 为 @android:id/list 的 ListView

    你的错误堆栈也这么说

    04-07 03:01:28.856: E/AndroidRuntime(2305): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

    【讨论】:

      【解决方案3】:

      在执行DownloadTask 之前你做错了,你已经设置了你的适配器,所以你总是在这里得到NullPinterException

       adapter=new CustomAdapter(this, allNews);
       lv.setAdapter(adapter);
      

      所以你必须从onCreate() 方法中删除它并在DownloadTaskonPostExecute() 方法中设置。喜欢,

          @Override
          protected void onPostExecute(String result) {
              // TODO Auto-generated method stub
              super.onPostExecute(result);
      
               adapter=new CustomAdapter(this, allNews);
               lv.setAdapter(adapter);
      
          }
      

      另外你刚刚声明了全局变量ArrayList&lt;ListIteam&gt; allNews;不初始化它。所以在onCreate() 方法上初始化它。喜欢

       allNews = new ArrayList<ListIteam>():
      

      【讨论】:

      • 删除这个后如何启动我的 DonloadTast?
      • 我刚刚告诉要删除 adapter=new CustomAdapter(this, allNews); lv.setAdapter(适配器);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多