1

我对自定义列表视图中的异步 http 调用有疑问。如何在我的以下自定义 Listview 中调用异步调用并解析 json 以填充 Listview 。我的自定义列表视图包含来自图像和文本。

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;

public class ListActivityS extends ListActivity 
{

    private GetHttpCall getCall;


    String item[];
    int id[];


    ArrayList<Video> videos;

    @SuppressLint("NewApi")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        super.onCreate(savedInstanceState);


        //Crearte instance to http call
        getCall=new GetHttpCall();
        String response=null;
        try {
            response=getCall.connect();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JSONParser _parser=new JSONParser();
        _parser.parseHttpJson(response);

        item = JSONParser.num_title;
        id=JSONParser.num_id;

        videos=new ArrayList<Video>();


         for(int i=0;i<item.length;i++)
         {
             Video vid=new Video();
             vid.setTitle(item[i]);
             vid.setId(id[i]);

             videos.add(vid);
         }

        getListView().setDividerHeight(2);

        getListView().setAdapter(new BindDataAdapter(this, videos));
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(item[position] + " is clicked.");
        builder.setPositiveButton("OK", null);
        builder.show();
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_list, menu);
        return true;
    }



}
4

5 回答 5

0

您在创建时开始获取 http 请求,这很糟糕。该请求应该在一个单独的线程中执行,例如在 asynctask 中。

  • 在创建时,使用临时项(如进度项)初始化列表。
  • 在 on create 中,启动一个异步任务, -- 在 asynctask 中,在 doBackground 中,执行请求 -- 在 asynctask 中,在 onPostExecute 中,删除临时项并添加您的项结果。

如果您需要,我可以提供一些代码,但是到处都有很多很好的示例。

于 2013-04-04T13:47:25.413 回答
0

参考这个这个.. 在那个教程中,他们将使用 AsyncTask 来获取 JSON 推文,解析它们,然后在 ListView 中显示它们。

thry 正在使用 AsyncTask 对用户搜索查询执行推文提要的获取、解析和显示。

于 2013-04-04T13:48:12.733 回答
0

您需要使用AsyncTask下载要显示的数据,然后通过更新列表适配器来实际显示该信息,因此ListView

private GetStuff extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Param . . . params){
        //Do all you i/o stuff like downloading content here
        return null;
    }

    @Override
    protected void onPostExecute(){
        //update your list adapter here
    }
}

如果需要,您可以在此处阅读有关 AsyncTask 的更多信息。使用它来更新列表视图时的想法如下。

(1) 执行所有的 i/o 功能doInBackground。从 Jellybean 开始,这不是一个选择,而是一个要求。任何涉及 i/o 的东西都必须在后台。此外,在这里处理任何位图或其他内容也是一个好习惯,因为它可以避免阻塞 UI 线程。获取您的内容并在此处进行处理。

(2)更新ListViewonPostExecute中的。一旦完成,在该AsyncTask结构onPostExecute中运行您在 UI 线程中包含的任何方法。doInBackround由于您必须ListView从 UI 线程更新,因此您用于更新适配器和通知数据集更改的方法必须在此处进行。

(3) 创建一个新任务并在您的活动中执行它。当您想要开始下载和更新过程时,您需要添加以下内容

GetStuff get = new GetStuff();
get.execute();

这实际上将启动任务运行。

AsyncTask就是这样,您可以根据您是否需要从不同的方法或任务本身传递事物来调整实现以满足您的需求。

于 2013-04-04T13:49:04.950 回答
0

我建议您阅读 和 的基础ListView知识AsyncTask

您的方法中有一些基本错误,例如

如何在以下自定义 Listview 中调用异步调用并解析 json 以填充 Listview

一个人不会AsyncTask从 a中调用一个ListView来填充ListView自身。最佳实践表明,您总是在用户生成的事件(如按钮点击)上调用 AsyncTask,当您获得响应时PostExecuteAsyncTask从那里启动 ListViewActivity!

这里有一些很好的教程:

于 2013-04-04T13:50:57.190 回答
0

异步任务

称呼new AsyncAction().execute(null, null, null);

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(item[position] + " is clicked.");
        builder.setPositiveButton("OK", null);
        builder.show();
    }


private class AsyncAction extends AsyncTask<String, Void, String> {
        public boolean status = false;
        private ProgressDialog pd;

        @Override
        protected String doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            try {


                status = true;

//Crearte instance to http call
        getCall=new GetHttpCall();
        String response=null;
        try {
            response=getCall.connect();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JSONParser _parser=new JSONParser();
        _parser.parseHttpJson(response);

        item = JSONParser.num_title;
        id=JSONParser.num_id;

        videos=new ArrayList<Video>();


         for(int i=0;i<item.length;i++)
         {
             Video vid=new Video();
             vid.setTitle(item[i]);
             vid.setId(id[i]);

             videos.add(vid);
         }

        getListView().setDividerHeight(2);



            } catch (Exception e) {
                // TODO: handle exception
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {

            pd.dismiss();

             getListView().setAdapter(new BindDataAdapter(this, videos));

        }

        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            pd = new ProgressDialog(listmessages.this);
            pd.setMessage("loading...");
            pd.setIndeterminate(true);
            pd.setCancelable(false);
            pd.show();
        }

    }



        }



    }
于 2013-04-04T13:53:23.340 回答