AsyncTask总是抛出空指针异常

问题描述:

我正在1.6版本中开发基于LBS的应用程序,它运行得非常好。此前它的运行良好,更新版本如2.2 & 2.3.3。但是现在突然间,它开始在我用于后台进程的AsyncTask类中给出空指针异常。这是我的错误日志的代码片段。AsyncTask总是抛出空指针异常

public class AndroidLocationActivity extends Activity { 

public String provider; 
public double latitude, longitude = 0; 
public LocationListener locationListener = new MyLocationListener(); 
public LocationManager locationManager; 
public CurrentPositionTask getCurrentLocation; 
public long time=0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    setCriteria(); 
    runAsyncTask(); 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    time = 0; 
    locationManager.removeUpdates(locationListener); 
} 

public void setCriteria() { 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_MEDIUM); 
    provider = locationManager.getBestProvider(criteria, true); 
    //Toast.makeText(getApplicationContext(), "Provider - " + provider, Toast.LENGTH_SHORT).show(); 
    if (provider == null) { 
     provider = LocationManager.GPS_PROVIDER; 
    } 
} 


public void runAsyncTask() { 
    // TODO Auto-generated method stub 
    if (getCurrentLocation == null) { 
     getCurrentLocation = new CurrentPositionTask(AndroidLocationActivity.this); 
    } 

    if (getCurrentLocation != null) { 
     getCurrentLocation.execute("Searching for Location"); 
    } 
} 

public boolean checkConnection() 
{ 
    //ARE WE CONNECTED TO THE NET 

    ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); 
    if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable()&& conMgr.getActiveNetworkInfo().isConnected()) { 
     return true; 
    } else { 
     return false; 
    } 
} 


class CurrentPositionTask extends AsyncTask<String, Void, Void> 
{ 
    private ProgressDialog Dialog = new ProgressDialog(AndroidLocationActivity.this); 
    Location location = new Location(locationManager.getLastKnownLocation(provider)); 
    Context context; 

    public CurrentPositionTask(Context mContext) { 
     this.context = mContext; 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     time = location.getTime(); 
     Toast.makeText(AndroidLocationActivity.this, String.valueOf(time), Toast.LENGTH_LONG).show(); 
     if (checkConnection()) { 
      //Toast.makeText(getApplicationContext(), "Internet", Toast.LENGTH_LONG).show(); 
      Dialog.setTitle("Loading"); 
      Dialog.setMessage("Searching for Location"); 
      Dialog.show(); 
      locationManager.requestLocationUpdates(provider, 0, 0, locationListener); 
     } 
     else { 
      Toast.makeText(getApplicationContext(), "Internet is Not Available", Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    protected Void doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 

     if (time >= 100000) { 
      latitude = 0; 
      longitude = 0; 
     } 

     while (latitude == 0 && longitude == 0) {    
      /*latitude = (float) (location.getLatitude()); 
      longitude = (float) (location.getLongitude());*/     
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     Toast.makeText(AndroidLocationActivity.this, "Location Floats:- " + latitude + "," + longitude, Toast.LENGTH_LONG).show(); 

     super.onPostExecute(result); 
     if (Dialog != null && Dialog.isShowing()) { 
      Dialog.dismiss(); 
      time=0; 
      Intent homeIntent = new Intent(AndroidLocationActivity.this.getApplicationContext(), HomeMenuActivity.class); 
      homeIntent.putExtra("lat", latitude); 
      homeIntent.putExtra("lng", longitude); 
      startActivity(homeIntent); 
     } 
     locationManager.removeUpdates(locationListener); 
    } 
} 

class MyLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 
     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 
    } 

    @Override 
    public void onProviderDisabled(String arg0) { 
     // TODO Auto-generated method stub 
     Toast.makeText(getApplicationContext(),"Gps Disabled",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onProviderEnabled(String arg0) { 
     // TODO Auto-generated method stub 
     Toast.makeText(getApplicationContext(),"Gps Enabled",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
     // TODO Auto-generated method stub 
    } 
} 

}

错误日志: -

12-04 16:59:04.848: E/AndroidRuntime(4165): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidlocation/com.androidlocation.AndroidLocationActivity}: java.lang.NullPointerException 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.ActivityThread.access$1500(ActivityThread.java:121) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.os.Looper.loop(Looper.java:123) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.ActivityThread.main(ActivityThread.java:3701) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at dalvik.system.NativeStart.main(Native Method) 
12-04 16:59:04.848: E/AndroidRuntime(4165): Caused by: java.lang.NullPointerException 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.location.Location.set(Location.java:119) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.location.Location.<init>(Location.java:112) 
**12-04 16:59:04.848: E/AndroidRuntime(4165): at com.androidlocation.AndroidLocationActivity$CurrentPositionTask.<init>(AndroidLocationActivity.java:84)** 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at com.androidlocation.AndroidLocationActivity.runAsyncTask(AndroidLocationActivity.java:60) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at com.androidlocation.AndroidLocationActivity.onCreate(AndroidLocationActivity.java:31) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-04 16:59:04.848: E/AndroidRuntime(4165):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623) 

3error这是我从日志,1调用runAsyncTask()方法,2创造异步的对象的时间得到任务类和第三个在初始化asynctask类中的位置变量时。

如果有人有任何想法请帮我解决它。谢谢...

+0

doInBackGround是应该做的繁重任务。据我所见,大部分繁重的任务都在preExecute中。 doinBackGround在工作线程中运行。它是否应该直接更新在UI线程上定义的成员? – user994886

+0

不,我不直接更新UI线程....而且我在preExecute中调用requestUpdates方法,就好像我从doInBackground调用它,它给了我错误。 – Scorpion

+0

任何人有任何关于这个错误的想法?如果有人知道这件事,请请帮助我。谢谢 – Scorpion

Location location = new Location(locationManager.getLastKnownLocation(provider))可以为空,尝试之前进行空检查:

@Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     time = location.getTime(); 
... 
+0

感谢Michele的快速回应。让我试试你的建议,希望它的作品.... – Scorpion

+0

米歇尔我试图检查它,但它仍然没有运行,并给我空指针,但我从这个 位置位置=新位置(locationManager() ; 至 位置位置=新位置(供应商); 但它没有给我的位置... – Scorpion

+0

你好,米歇尔,你有任何想法来解决这个问题?如果您有任何想法,请帮助我,因为我无法解决此问题。 – Scorpion