【问题标题】:Android Async JsonTask ErrorAndroid 异步 JsonTask 错误
【发布时间】:2016-07-29 19:14:49
【问题描述】:

我正在尝试从 URL 接收 json。获得对象后,我将对其进行解析并将其加载到我的应用程序的列表视图中。我正在使用适配器创建列表视图并在我的 mainActivity 上运行我的 jsonTask,然后将结果传递给适配器。它总是抛出空指针异常。有没有更好的方法来做到这一点?我是 android 新手,json 任务以异步方式运行如何让我的 UI 加载等待 jsonTask 的结果。这是我的代码;

主要活动;

public class TvActivity extends Activity {
    ListView lv;
    ArrayList<TV> tvList;

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        new JSONTask().execute();
        lv = (ListView) findViewById(R.id.listView);
        lv.setAdapter(new Adapter(this, tvList));

    }
}

public class JSONTask extends AsyncTask<String, String, JSONArray> {
        ProgressDialog pDialog;

        @Override
        protected JSONArray doInBackground(String... params) {
            return Utility.getJSONArray(Constants.TV_JSON_URL);
        }

        @Override
        protected void onPostExecute(JSONArray result) {
            pDialog.dismiss();

            for (int i = 0; i < result.length(); i++) {
                try {
                    JSONObject row = result.getJSONObject(i);
                    String title = row.getString(Constants.TV_TITLE);
                    String code = row.getString(Constants.TV_CODE);
                    String image_url = row.getString(Constants.TV_IMAGE_URL);
                    tvList.add(new TV(title, image_url, code));

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

                }

            }
        }
    }

我的适配器;

public class TvAdapter extends BaseAdapter {

    String[] result;
    Context context;
    ArrayList<TV> tvArrayList;
    int[] imageId;
    private static LayoutInflater inflater = null;

    public TvAdapter(TvActivity mainActivity, ArrayList<TV> tvList) {
        // TODO Auto-generated constructor stub
        //result = prgmNameList;
        context = mainActivity;
        tvArrayList = tvList;
        //imageId = prgmImages;
        inflater = (LayoutInflater) context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return tvArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return tvArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class Holder {
        TextView tv;
        ImageView img;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        TV tvItem = (TV) getItem(position);

        Holder holder = new Holder();
        View rowView;
        rowView = inflater.inflate(R.layout.tv_list, null);
        holder.tv = (TextView) rowView.findViewById(R.id.textView1);
        holder.img = (ImageView) rowView.findViewById(R.id.imageView1);
        holder.tv.setText(tvItem.getTitle());
       // holder.img.setImageResource(imageId[position]);
        rowView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "You Clicked " + tvItem[position], Toast.LENGTH_LONG).show();
            }
        });
        return rowView;
    }

}

【问题讨论】:

  • 没有堆栈跟踪很难知道你的问题
  • 解决了。感谢您的每一个评论和回答。

标签: android json


【解决方案1】:

AsyncTask 没有问题。在这里使用之前先初始化这个ArrayList&lt;TV&gt; tvListlv.setAdapter(new Adapter(this, tvList))

tvList = new ArrayList<>();
lv.setAdapter(new Adapter(this, tvList));

【讨论】:

  • 我初始化了值,但我需要用异步任务的结果填充它。现在由于progress.dialog而引发错误
  • @FatihAktepe 好吧...ProgressDialog pDialog; ...它是空的!
  • 你也没有初始化进度对话框。 :)
  • 我初始化了一切。我从 url 获取数据,但即使我调用 notifyDataSetChanged(),视图也不会自行刷新。
  • 我用JS很久了。将您的开发语言更改为 Java 具有挑战性。感谢您的回答,它也有帮助。
【解决方案2】:

你可以尝试如下:

new JSONTask().execute();
lv = (ListView) findViewById(R.id.listView);
tvList = new ArrayList<TV>();
lv.setAdapter(new Adapter(this, tvList));

然后

@Override
protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(context);
    pDialog.setCancelable(true);
    pDialog.setMessage("Loading...");
    pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pDialog.setProgress(0);
    pDialog.show();
}

onPostExecute 方法下方添加adapter.notifyDataSetChanged();

【讨论】:

  • 欢迎。快乐编码:)
【解决方案3】:

应用程序崩溃,因为 tvList 为空。在将其传递给 Adapter 构造函数之前对其进行初始化。 一旦异步任务返回值,还使用可以在适配器上调用的 notifyDataSetChanged 通知适配器刷新自身。 例如。 adapter.notifyDataSetChanged().

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多