来自AsyncTask的Listview自定义适配器

时间:2013-02-18 06:00:12

标签: android android-listview android-asynctask

我正在尝试从服务器上的MySQL数据库中获取作物列表,并使用此列表填充ListView。以下是我的代码:

这是AsyncTask类:

    class GetCropsList extends AsyncTask<String, Integer, ArrayList<String>> {



        private final ProgressDialog dialog = new ProgressDialog(CropsListActivity.this);


        @Override
         protected void onPreExecute() {
                dialog.setMessage("Please Wait.");
                dialog.setCancelable(true); 
                dialog.show();
            }

         @Override
         protected ArrayList<String> doInBackground(String... params) {


             ArrayList<String> list = null;
                String Lang=params[0];
                Log.i("lang",Lang);
                try {
                     HttpClient httpclient = new DefaultHttpClient();
                     HttpPost httppost = new HttpPost("http://10.0.2.2/Farm_O_Pedia/GetCropsList.php");


                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
                    nameValuePairs.add(new BasicNameValuePair("LanguageName",Lang));     
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    HttpResponse res= httpclient.execute(httppost);
                    Log.i("HTTP ok", res.toString());
                    HttpEntity entity = res.getEntity();
                    input=entity.getContent();
                } 

                catch (Exception e) {

                    Log.i("HTTP Failed", e.toString());
                } 

                try{
                    BufferedReader reader = new BufferedReader(new InputStreamReader(input,"UTF-8"));
                    sb = new StringBuilder();
                    sb.append(reader.readLine() + "\n");

                    String line="0";
                    while ((line = reader.readLine()) != null) {
                                  sb.append(line + "\n");
                    }

                    input.close();
                    result=sb.toString();
                    Log.i("JsonObj",result);

                }
               catch(Exception e){
                          Log.e("log_tag", "Error converting result "+e.toString());
                }
                try {
                    jArray=new JSONArray(result);
                    JSONObject obj=null;
                    for(int i=0;i<jArray.length();i++)
                    {
                        obj=jArray.getJSONObject(i);
                        list.add(obj.getString("crop_name"));
                    }


                } catch (JSONException e) {

                    e.printStackTrace();
                }

                return list;
            }


         protected void onPostExecute(final ArrayList<String> p_result) {

             super.onPostExecute(p_result);          

            if (dialog.isShowing()) 
            {
                dialog.dismiss();
            }

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(CropsListActivity.this,
                            R.layout.crops_listview,p_result ) {

                 public View getView(int position, View convertView, ViewGroup parent) {
                         View v = super.getView(position, convertView, parent);


                         ((TextView) v).setTypeface(tf);
                         ((TextView) v).setText(p_result.get(position));
                         ((TextView) v).setTextColor(Color.WHITE);
                         return v;
                 }

            };

                CropsList.setAdapter(adapter);




      }







    }

我还注意不要在doBackground中触摸UI。我的logcat是:

02-18 11:20:44.301: E/AndroidRuntime(597): FATAL EXCEPTION: AsyncTask #2
    02-18 11:20:44.301: E/AndroidRuntime(597): java.lang.RuntimeException: An error occured while executing doInBackground()
    02-18 11:20:44.301: E/AndroidRuntime(597):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.lang.Thread.run(Thread.java:1019)
    02-18 11:20:44.301: E/AndroidRuntime(597): Caused by: java.lang.NullPointerException
    02-18 11:20:44.301: E/AndroidRuntime(597):  at com.example.farm_o_pedia.CropsListActivity$GetCropsList.doInBackground(CropsListActivity.java:170)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at com.example.farm_o_pedia.CropsListActivity$GetCropsList.doInBackground(CropsListActivity.java:1)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
    02-18 11:20:44.301: E/AndroidRuntime(597):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
    02-18 11:20:44.301: E/AndroidRuntime(597):  ... 4 more
    02-18 11:20:45.660: E/WindowManager(597): Activity com.example.farm_o_pedia.CropsListActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40529ed8 that was originally added here
    02-18 11:20:45.660: E/WindowManager(597): android.view.WindowLeaked: Activity com.example.farm_o_pedia.CropsListActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40529ed8 that was originally added here
    02-18 11:20:45.660: E/WindowManager(597):   at android.view.ViewRoot.<init>(ViewRoot.java:258)
    02-18 11:20:45.660: E/WindowManager(597):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
    02-18 11:20:45.660: E/WindowManager(597):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    02-18 11:20:45.660: E/WindowManager(597):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.Dialog.show(Dialog.java:241)
    02-18 11:20:45.660: E/WindowManager(597):   at com.example.farm_o_pedia.CropsListActivity$GetCropsList.onPreExecute(CropsListActivity.java:116)
    02-18 11:20:45.660: E/WindowManager(597):   at android.os.AsyncTask.execute(AsyncTask.java:391)
    02-18 11:20:45.660: E/WindowManager(597):   at com.example.farm_o_pedia.CropsListActivity.onCreate(CropsListActivity.java:80)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    02-18 11:20:45.660: E/WindowManager(597):   at android.os.Handler.dispatchMessage(Handler.java:99)
    02-18 11:20:45.660: E/WindowManager(597):   at android.os.Looper.loop(Looper.java:123)
    02-18 11:20:45.660: E/WindowManager(597):   at android.app.ActivityThread.main(ActivityThread.java:3683)
    02-18 11:20:45.660: E/WindowManager(597):   at java.lang.reflect.Method.invokeNative(Native Method)
    02-18 11:20:45.660: E/WindowManager(597):   at java.lang.reflect.Method.invoke(Method.java:507)
    02-18 11:20:45.660: E/WindowManager(597):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    02-18 11:20:45.660: E/WindowManager(597):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    02-18 11:20:45.660: E/WindowManager(597):   at dalvik.system.NativeStart.main(Native Method)

任何帮助都会很明显。

4 个答案:

答案 0 :(得分:3)

在doingBackground()

只需替换此

 ArrayList<String> list = null;

 ArrayList<String> list = new  ArrayList<String>(); 

答案 1 :(得分:2)

你应该初始化Arraylist,

替换doInBackground中的代码

 ArrayList<String> list = new ArrayList<String>();

答案 2 :(得分:0)

    protected void onPostExecute(final ArrayList<String> p_result) {
    try {
                    jArray=new JSONArray(result);
                    JSONObject obj=null;
                    for(int i=0;i<jArray.length();i++)
                    {
                        obj=jArray.getJSONObject(i);
                        list.add(obj.getString("crop_name"));
                    }


                } catch (JSONException e) {

                    e.printStackTrace();
                }

                return list;
            }
}

答案 3 :(得分:0)

doInBackground()中的某些内容为null。去调试检查它是什么。