当前位置: 首页 > 面试题库 >

设置异步任务以将Json加载到列表视图中

太叔京
2023-03-14
问题内容

我将服务器上的PHP脚本生成的json对象生成,然后使用图像的延迟加载将其解析为listview。问题在于json加载速度会相对较快,或者会挂起一两秒钟,具体取决于服务器上的响应,这可能令人沮丧。当我第一次打开应用程序时,挂起尤其令人讨厌,因为它会挂在黑屏上,直到对象被加载为止,然后当我在应用程序中更新列表时,它具有相同的功能,但至少已加载了视图。这是我获取json的代码:

public void getJson(String selection, String url) {
    JSONObject json = null;
    String formatedcat = selection.toLowerCase();
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
    json = JSONfunctions
            .getJSONfromURL(url);
    try {
        //the array title that you parse
        JSONArray category = json.getJSONArray(formatedcat);
        for (int i = 0; i < category.length(); i++) {               
            HashMap<String, String> map = new HashMap<String, String>();
            JSONObject c = category.getJSONObject(i);
            map.put("id", String.valueOf(i));
            map.put("name",
                    c.getString("title"));
            //map.put("text",c.getString("title"));
            map.put("ts",c.getString("run_date") );
            map.put("image","http:"+c.getString("url"));
            mylist.add(map);
        }
    } catch (JSONException e) {

    }
    ListAdapter adapter = new JsonAdapter(this, mylist, R.layout.list,
            new String[] { "name", "text", "ts"}, new int[] { R.id.item_title,
                    R.id.item_subtitle, R.id.timestamp});
    setListAdapter(adapter);        
}

适配器代码

public class JsonAdapter extends SimpleAdapter {

    public ImageManager imageManager;
    public ListActivity context;
    public ArrayList<HashMap<String,String>> list;
    public String[] fieldNames;
    public int[] fieldTargetIds;

    public JsonAdapter(ListActivity c, 
            ArrayList<HashMap<String, String>> mylist,
            int textViewResourceId,
            String[] fieldNames,
            int[] fieldTargetIds) {
        super(c, mylist, textViewResourceId, fieldNames, fieldTargetIds );
        this.context = c;
        this.list = mylist;
        this.fieldNames = fieldNames;
        this.fieldTargetIds = fieldTargetIds;
        this.imageManager = new ImageManager(context.getApplicationContext());
    }

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

        View row = convertView;
        if (row == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = vi.inflate(R.layout.list, null);
        }
        //super.getView(position, convertView, parent);
        ImageView imgView = (ImageView) row.findViewById(R.id.doodlepic);

        try {
            String url = list.get(position).get("image");
            imgView.setTag(url);
            imageManager.displayImage(url, context, imgView);
        } catch (Exception e) {

        }

        for (int i=0; i<fieldNames.length; i++) {
            TextView tv = (TextView) row.findViewById(fieldTargetIds[i]);
            tv.setText(list.get(position).get(fieldNames[i]));              
        }


        return row;
    }

}

在生成和下载json对象时,如何实现异步任务以显示进度对话框?我已经尝试过使用线程和异步任务,但是我不太清楚如何将代码分解为适当的部分。


问题答案:

AsyncTask的onPreExecute和onPostExecute将在UI线程中运行,doInBackground将在另一个线程中运行,因此下面的代码对您来说很合适

public class YourActivity extends Activiy{
   public void getJson(String selection, String url) { 
           new LoadJsonTask().execute( selection, url);

   }
   private class LoadJsonTask extends AsyncTask<String, Void, ArrayList<HashMap<String, String>> > {
       ProgressDialog dialog ;
       protected void onPreExecute (){
            dialog = ProgressDialog.show(YourActivity.this ,"title","message");

       }
       protected ArrayList<HashMap<String, String>> doInBackground (String... params){
           return doGetJson(params[0],params[1]);
       }
       protected void onPostExecute(ArrayList<HashMap<String, String>> mylist){

            ListAdapter adapter = new JsonAdapter(YourActivity.this, mylist, R.layout.list,
              new String[] { "name", "text", "ts"}, new int[] { R.id.item_title,
                R.id.item_subtitle, R.id.timestamp});
            setListAdapter(adapter);
            dialog.dismiss();
       }
    }

 public ArrayList<HashMap<String, String>> doGetJson(String selection, String url) {
     JSONObject json = null;
     String formatedcat = selection.toLowerCase();
     ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
     json = JSONfunctions
        .getJSONfromURL(url);
     try {
    //the array title that you parse
    JSONArray category = json.getJSONArray(formatedcat);
    for (int i = 0; i < category.length(); i++) {               
        HashMap<String, String> map = new HashMap<String, String>();
        JSONObject c = category.getJSONObject(i);
        map.put("id", String.valueOf(i));
        map.put("name",
                c.getString("title"));
        //map.put("text",c.getString("title"));
        map.put("ts",c.getString("run_date") );
        map.put("image","http:"+c.getString("url"));
        mylist.add(map);
    }
} catch (JSONException e) {

}
   return mylist;
  ....   
}


 类似资料:
  • 问题内容: 这是我正在处理的代码: 我想在列表视图上显示它们。您有任何教程可以帮助我入门吗?我是Web服务的新手。谢谢。 问题答案: 列表视图中最受欢迎的教学作品之一,可能会帮助您: - 拉维的博客 解析json之后要执行的步骤: 您可以使用jackson库用一行代码来解析json。 (单击此链接以获取有关对象映射教程的更多信息)

  • Highcharts 曲线图 以下实例演示了异步加载数据曲线图表。这边我们通过 jQuery.getJSON() 方法从异步加载 csv 文件: 我们在前面的章节已经了解了 Highcharts 配置语法。接下来让我们来看个完整实例: 导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/d

  • 问题内容: 我正在使用sshexec,它取决于jsch-0.1.48.jar。我不能只是将其放在ant / lib目录中,因为其他希望使用相同构建脚本的用户必须先在其计算机上进行配置,然后才能进行配置。 我想要做的是能够在项目中引用jsch-0.1.48.jar。目前,我将它放在project / libs目录中,并且正在尝试类似的操作: 但这不起作用: 问题答案: jsch jar与我的项目打包

  • 我正在为列表视图编写一个lazyload代码,在这个代码中,我得到了一个json格式的文本和图像url,并将它们放在列表视图中。 图像和文字都相应地显示为我想要的。 我面临的问题是,当列表向下或向上滚动时,视图的索引会受到干扰。 假设我的列表中有10个元素,图像可以横向预览。最初,我可以看到4个元素的onclick操作运行良好,但当我向下滚动并单击第7个元素时,索引会受到干扰,并导致空指针异常。

  • 问题内容: 我一直在和Yeoman&Jade玩耍。我通过创建了一个小型测试应用程序(这是一个有角度的应用程序,但这不是重点)。 当我在命令行输入时,它将: 编译coffeescript和罗盘文件 启动服务器 启动浏览器 在浏览器中观看并重新加载CoffeeScript和指南针更改 Yeoman的一大特色! 现在我想要与Jade相同的功能。 所以我通过安装 grunt-jade并在 GruntFil

  • 问题内容: 我想使用jQuery在页面上异步加载外部图像, 并且尝试了以下方法: 但是它总是返回错误,是否有可能像这样加载图像? 我尝试使用method,但是它有效,但是我不知道如果图像不可用,如何设置超时时间(404)。我怎样才能做到这一点? 问题答案: 无需ajax。您可以创建一个新的图像元素,设置其source属性,并在完成加载后将其放置在文档中的某个位置: