Android 带有AsyncTask的Setonitemclicklistener提供NullPointerException

Android 带有AsyncTask的Setonitemclicklistener提供NullPointerException,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,需要你的帮助!!! 我有活动,在那里我得到一些JSON格式的数据,并将其放在ListView中。一切正常。但我想用Setonitemclicklistener定义在列表中单击了什么项。我试图在我的内部连接类的onPostExecuted()方法中使用它,该类扩展了AsyncTask,但我得到了NullPoinerException public class ConnectionActivity extends ListActivity{ JsonParser jsonParser = new

需要你的帮助!!! 我有活动,在那里我得到一些JSON格式的数据,并将其放在ListView中。一切正常。但我想用Setonitemclicklistener定义在列表中单击了什么项。我试图在我的内部连接类的onPostExecuted()方法中使用它,该类扩展了AsyncTask,但我得到了NullPoinerException

public class ConnectionActivity extends ListActivity{
JsonParser jsonParser =  new JsonParser(); 
private ListView listView;
JSONArray inbox = null;
  private ProgressDialog pDialog;
private static final String TAG_ID = "ID";
private static final String TAG_NAME = "Date";
private static final String TAG_DATE = "Name";
private static final String TAG_PRICE = "Price";
ArrayList<HashMap<String,String>> resultList;

public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 resultList = new ArrayList<HashMap<String,String>> ();
 new Connection().execute();
 new ListHandler().execute();

}
class Connection extends AsyncTask<String,String,String>
{

    @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ConnectionActivity.this);
            pDialog.setMessage("Не базарь и жди пока загрузиться!!!!");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

    @Override
    protected String doInBackground(String... args) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // getting JSON string from URL
        String json = jsonParser.makeHttpRequest();
        Log.d("Outbox JSON",json.toString());

        try{

            JSONArray jArray = new JSONArray(json);
            for (int i=0;i<jArray.length();i++) {
                    JSONObject c = jArray.getJSONObject(i);


                 // Storing each json item in variable
                    String id = c.getString(TAG_ID);
                    String name= c.getString(TAG_NAME);
                    String date = c.getString(TAG_DATE);
                    String price = c.getString(TAG_PRICE);

                    // creating new HashMap
                    HashMap<String, String> hashmap = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    hashmap.put(TAG_ID, id);
                    hashmap.put(TAG_NAME, name);
                    hashmap.put(TAG_DATE, date);
                    hashmap.put(TAG_PRICE, price);

                    // adding HashList to ArrayList
                    resultList.add(hashmap);

            }

        }
        catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());
        }
        return null;
    }
     protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            ConnectionActivity.this, resultList,
                            R.layout.connect_item, new String[] { TAG_ID, TAG_NAME, TAG_DATE, TAG_PRICE },
                            new int[] { R.id.order_id, R.id.order_date, R.id.order_name, R.id.order_price });
                    // updating listview
                    setListAdapter(adapter);
                    listView =  (ListView) findViewById(R.id.list);
                    listView.setOnItemClickListener(new ListClickListener());
                }
            });

        }
}
公共类连接活动扩展了ListActivity{
JsonParser JsonParser=新的JsonParser();
私有列表视图列表视图;
JSONArray收件箱=null;
私人对话;
私有静态最终字符串标记\u ID=“ID”;
私有静态最终字符串标记_NAME=“Date”;
私有静态最终字符串标记_DATE=“Name”;
私有静态最终字符串标记_PRICE=“PRICE”;
ArrayList结果列表;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
resultList=newarraylist();
新建连接().execute();
新建ListHandler().execute();
}
类连接扩展了异步任务
{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(ConnectionActivity.this);
pDialog.setMessage(“бззззззжззззззззззз1079;
pDialog.setUndeterminate(假);
pDialog.setCancelable(假);
pDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…args){
List params=new ArrayList();
//从URL获取JSON字符串
字符串json=jsonParser.makeHttpRequest();
Log.d(“发件箱JSON”,JSON.toString());
试一试{
JSONArray jArray=新的JSONArray(json);
对于(int i=0;i值
hashmap.put(TAG_ID,ID);
hashmap.put(标记名称、名称);
hashmap.put(标记日期,日期);
hashmap.put(标签价格、价格);
//将哈希列表添加到ArrayList
add(hashmap);
}
}
捕获(JSONException e){
Log.e(“Log_标记”,“错误解析数据”+e.toString());
}
返回null;
}
受保护的void onPostExecute(字符串文件\u url){
//获取所有产品后关闭对话框
pDialog.disclose();
//从后台线程更新UI
runOnUiThread(新的Runnable(){
公开募捐{
/**
*将解析的JSON数据更新到ListView中
* */
ListAdapter=新的SimpleAdapter(
ConnectionActivity.this,resultList,
R.layout.connect_item,新字符串[]{TAG_ID,TAG_NAME,TAG_DATE,TAG_PRICE},
新int[]{R.id.order\u id,R.id.order\u date,R.id.order\u name,R.id.order\u price});
//更新列表视图
setListAdapter(适配器);
listView=(listView)findViewById(R.id.list);
setOnItemClickListener(新的ListClickListener());
}
});
}
}
我认为问题在于使用一个线程,所以我在我的连接活动中创建了一个类似这样的内部类^

 class ListHandler extends AsyncTask<Void,Void,Void>
     {
        protected void onPreExecute ()
         {


         }
        @Override
        protected Void  doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        protected void onPostExecute()
        {
            listView =  (ListView) findViewById(R.id.list);

            listView.setOnItemClickListener(new OnItemClickListener() {

           public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {
               Log.d("Click on the item","!!!!!!!!!!!!!!!!!!!!!");
               Toast toast = Toast.makeText(getApplicationContext(), 
                       "Пора покормить кота!", Toast.LENGTH_SHORT); 
                    toast.show(); 
           } 
        });


        }


     }
类ListHandler扩展了异步任务
{
受保护的void onPreExecute()
{
}
@凌驾
受保护的Void doInBackground(Void…arg0){
//TODO自动生成的方法存根
返回null;
}
受保护的void onPostExecute()
{
listView=(listView)findViewById(R.id.list);
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(适配器视图适配器、视图视图、整型位置、长参数){
Log.d(“点击项目”、“!!!!!!!!!!!!!”;
Toast Toast=Toast.makeText(getApplicationContext(),
“ПааПааПааааааааааа;
toast.show();
} 
});
}
}
但它不起作用。我的意思是,当我单击该项时,我无法获得Toast,但没有例外。我尝试在活动的void onResume()方法中处理setonitemclicklistener,但我得到了NullPointerException。我也在ListHandler类的OnPreExecute()方法中处理了此问题-相同的结果。。。
请帮忙…

setContentView(R.layout.yourxml)在哪里?

我想你在oncreate方法中忘记了它

因此,您的
列表视图为空,并给出NPE。


onPostExecute方法有runonUiThread,删除它不需要它。
它已经在UI线程中运行。

通过从活动而不是ListActivity扩展并使用setContentView()解决了问题。

我在我的ConnectionActivity中从ListActivity扩展。我的布局只有一个带有android:id=“@+id/list”的ListView…因此它自动定义,正如我前面所说,JSON数据正在成功地放入其中…我还使用listView=(listView)findViewById(R.id.list)来定义它;并且仅在此之后使用listView.setOnItemClickListener(new ListClickListener());是的,通过扩展我的ConnectionActivity中的Activity not ListActivity并使用setContentView()方法解决了该问题。