listview和远程数据库中的java.lang.NullPointerException

时间:2014-05-17 16:04:29

标签: java android

我从远程数据库读取要在ListView中写入包含imageview和文本的女巫。

我有java.lang.NullPointerException错误 我试图解决它,但我无法解决。

在doInBackground方法的for循环中,数组String是可以的,我可以在logcat中写出结果但是在for循环之外我不能。

感谢。

package com.example.alztrimakis;

import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

public class contact extends Activity {

ListView list;
LazyImageLoadAdapter adapter;

JSONParser jParser = new JSONParser();
private static final String TAG_nom = "nom";
private static final String TAG_prenom = "prenom";
private static final String TAG_relation = "relation";
private static final String TAG_SUCCESS = "success";
private static final String TAG_photo = "photo";
private static final String TAG_pers = "idpersonne";
 SharedPreferences pref;

 String [] tabphoto, tabnom, tabprenom, tabrelation, tabidpers;
private ProgressDialog pDialog;
String idp ;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact);

    list=(ListView)findViewById(R.id.listViewcontact);

    loadReps verif = new loadReps();
    verif.execute();
    Log.d("load","ok");
    Log.d("tabphoto",tabphoto.toString());
    Log.d("tabnom",tabnom.toString());
    Log.d("tabprenom",tabprenom.toString());
    Log.d("tabrelation",tabrelation.toString());
    Log.d("tabidpers",tabidpers.toString());

    // Create custom adapter for listview
    adapter= new LazyImageLoadAdapter(this, tabphoto, tabnom, tabprenom, tabrelation);
    Log.d("adapter","ok");
    //Set adapter to listview
    list.setAdapter(adapter);

}
 public void onItemClick(int mPosition)
{
    String tempValues = tabphoto[mPosition];
    String idperss = tabidpers[mPosition];

    Toast.makeText(contact.this, 
            "Image URL : "+tempValues+" dest "+idperss, 
            Toast.LENGTH_LONG)
    .show();
}

// Image urls used in LazyImageLoadAdapter.java file

class loadReps extends  AsyncTask<String, String, String> {


     JSONObject tt;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(contact.this);
            pDialog.setMessage("Chargement...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
            Log.d("onpreExec","ok");
        }
        @Override
        protected String doInBackground(String... args) {

            Log.d("back","ok");
            pref = getSharedPreferences("memtrimakis",0);
             idp = pref.getString("idpatient", "no");       
            if (idp != "no")
            {
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("idpatient",idp));
            IWebServices webServices = new WebServices();
            try {
            String result = webServices.getResult("affcontacts.php",nameValuePairs);
            JSONObject json = new JSONObject(result);
            Log.d("rep:", json.toString());
                int success = json.getInt(TAG_SUCCESS);
                selectip ipaddresse =new selectip();
                if (success == 1) {
                    tabphoto = new String[json.length()];
                    tabnom = new String[json.length()];
                    tabprenom = new String[json.length()];
                    tabrelation = new String[json.length()];
                    tabidpers = new String[json.length()];
                for (int i=0; i<json.length();i++)
                     {
                    tt = (JSONObject) json.get(String.valueOf(i));
                    tabphoto[i] = ipaddresse.adresseip().toString()+"img/"+tt.getString(TAG_photo);
                    tabnom[i]= tt.getString(TAG_nom);
                    tabprenom[i]= tt.getString(TAG_prenom);;
                    tabrelation[i]= tt.getString(TAG_relation);
                    tabidpers[i]= tt.getString(TAG_pers);
                     }


                }
                }

            catch (Exception e) {
                 e.printStackTrace();
            }
            }
                return null;
            }
        @Override
            protected void onPostExecute(String file_url) {


                Log.d("post","ok");
                runOnUiThread(new Runnable() {
                    @Override

                    public void run() {
                        for (int j=0; j<tabphoto.length;j++)
{Log.d("tabphotob"+j,tabphoto[j]);}


                    }
                });
                if(pDialog != null)
                    pDialog.dismiss();  
                }

 }

}

这是logcat

05-17 16:35:39.665: E/AndroidRuntime(2865): FATAL EXCEPTION: main
05-17 16:35:39.665: E/AndroidRuntime(2865): java.lang.RuntimeException: Unable to start     activity ComponentInfo{com.example.alztrimakis/com.example.alztrimakis.contact}: java.lang.NullPointerException
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.os.Looper.loop(Looper.java:137)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.ActivityThread.main(ActivityThread.java:5103)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at java.lang.reflect.Method.invokeNative(Native Method)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at java.lang.reflect.Method.invoke(Method.java:525)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at dalvik.system.NativeStart.main(Native Method)
05-17 16:35:39.665: E/AndroidRuntime(2865): Caused by: java.lang.NullPointerException
05-17 16:35:39.665: E/AndroidRuntime(2865):     at com.example.alztrimakis.contact.onCreate(contact.java:47)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.Activity.performCreate(Activity.java:5133)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-17 16:35:39.665: E/AndroidRuntime(2865):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
05-17 16:35:39.665: E/AndroidRuntime(2865):     ... 11 more

2 个答案:

答案 0 :(得分:1)

异步任务是异步的。当execute()返回时,结果不可用,当您尝试访问未初始化的tabphoto数组时,您的NPE就会出现。

将使用异步任务结果的代码移动到任务onPostExecute()

答案 1 :(得分:0)

NPE,因为在分配到适配器之前,tabphoto,tabnom,tabprenom,tabrelation数组都没有初始化。发生这种情况是因为Asynctasks是异步错误,在您尝试访问结果时可能仍在运行。确保在onPostExecute()中构造适配器,如下所示:

package com.example.alztrimakis;


import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

public class contact extends Activity {

ListView list;
LazyImageLoadAdapter adapter;

JSONParser jParser = new JSONParser();
private static final String TAG_nom = "nom";
private static final String TAG_prenom = "prenom";
private static final String TAG_relation = "relation";
private static final String TAG_SUCCESS = "success";
private static final String TAG_photo = "photo";
private static final String TAG_pers = "idpersonne";
 SharedPreferences pref;

 String [] tabphoto, tabnom, tabprenom, tabrelation, tabidpers;
private ProgressDialog pDialog;
String idp ;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact);

    list=(ListView)findViewById(R.id.listViewcontact);

    loadReps verif = new loadReps();
    verif.execute();
    Log.d("load","ok");
    Log.d("tabphoto",tabphoto.toString());
    Log.d("tabnom",tabnom.toString());
    Log.d("tabprenom",tabprenom.toString());
    Log.d("tabrelation",tabrelation.toString());
    Log.d("tabidpers",tabidpers.toString());



}
 public void onItemClick(int mPosition)
{
    String tempValues = tabphoto[mPosition];
    String idperss = tabidpers[mPosition];

    Toast.makeText(contact.this, 
            "Image URL : "+tempValues+" dest "+idperss, 
            Toast.LENGTH_LONG)
    .show();
}

// Image urls used in LazyImageLoadAdapter.java file

class loadReps extends  AsyncTask<String, String, String> {


     JSONObject tt;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(contact.this);
            pDialog.setMessage("Chargement...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
            Log.d("onpreExec","ok");
        }
        @Override
        protected String doInBackground(String... args) {

            Log.d("back","ok");
            pref = getSharedPreferences("memtrimakis",0);
             idp = pref.getString("idpatient", "no");       
            if (idp != "no")
            {
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("idpatient",idp));
            IWebServices webServices = new WebServices();
            try {
            String result = webServices.getResult("affcontacts.php",nameValuePairs);
            JSONObject json = new JSONObject(result);
            Log.d("rep:", json.toString());
                int success = json.getInt(TAG_SUCCESS);
                selectip ipaddresse =new selectip();
                if (success == 1) {
                    tabphoto = new String[json.length()];
                    tabnom = new String[json.length()];
                    tabprenom = new String[json.length()];
                    tabrelation = new String[json.length()];
                    tabidpers = new String[json.length()];
                for (int i=0; i<json.length();i++)
                     {
                    tt = (JSONObject) json.get(String.valueOf(i));
                    tabphoto[i] = ipaddresse.adresseip().toString()+"img/"+tt.getString(TAG_photo);
                    tabnom[i]= tt.getString(TAG_nom);
                    tabprenom[i]= tt.getString(TAG_prenom);;
                    tabrelation[i]= tt.getString(TAG_relation);
                    tabidpers[i]= tt.getString(TAG_pers);
                     }


                }
                }

            catch (Exception e) {
                 e.printStackTrace();
            }
            }
                return null;
            }
        @Override
            protected void onPostExecute(String file_url) {


                Log.d("post","ok");
                runOnUiThread(new Runnable() {
                    @Override

                    public void run() {
                        for (int j=0; j<tabphoto.length;j++)
{Log.d("tabphotob"+j,tabphoto[j]);}


                    }
                });
 // Create custom adapter for listview
        adapter= new LazyImageLoadAdapter(contact.this, tabphoto, tabnom, tabprenom, tabrelation);
        Log.d("adapter","ok");
        //Set adapter to listview
        list.setAdapter(adapter);
                    if(pDialog != null)
                        pDialog.dismiss(); 


                }

 }

}