自定义列表视图中的异步http调用

时间:2013-04-04 13:35:53

标签: android android-asynctask

我对自定义列表视图中的async 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;
    }



}

5 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

引用thisthis ..在该教程中,他们将使用AsyncTask获取JSON推文,解析它们,然后在ListView中显示它们。

正在使用AsyncTask在用户搜索查询上执行提取,解析和显示推文提要。

答案 2 :(得分: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
    }
}

如果您愿意,可以read more about AsyncTask here。使用它来更新列表视图的想法如下。

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

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

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

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

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

就是这样,你可以根据你是否需要从不同的AsyncTask方法或任务本身传递东西来调整implimentation以满足你的需求。

答案 3 :(得分:0)

我建议您仔细阅读ListViewAsyncTask的基础知识。

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

  

如何在我的以下自定义Listview和解析中调用异步调用   json填写Listview

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

以下是一些很好的教程:

答案 4 :(得分:0)

asynctask

致电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();
        }

    }



        }



    }