Java AsyncTask中ProgressDialog的NullPointerException
我在另一个类中有一个AsyncTask类,它位于与MainActivity不同的文件中 GetWarehouseSales.javaJava AsyncTask中ProgressDialog的NullPointerException,java,android,android-asynctask,Java,Android,Android Asynctask,我在另一个类中有一个AsyncTask类,它位于与MainActivity不同的文件中 GetWarehouseSales.java public class GetWarehouseSales extends Activity { private String TAG = MainActivity.class.getSimpleName(); private ListView lv; private ProgressDialog pDialog; //URL
public class GetWarehouseSales extends Activity {
private String TAG = MainActivity.class.getSimpleName();
private ListView lv;
private ProgressDialog pDialog;
//URL to get JSON details
private static String url = "http://192.168.0.1/mycc/retrieve_ws.php";
ArrayList<HashMap<String,String>> sales_details;
public GetWarehouseSales(){
}
public void executeGWS(){
new RetrieveWarehouseSalesTask().execute();
}
public class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,Void>{
public RetrieveWarehouseSalesTask(){
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(GetWarehouseSales.this);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0){
HttpHandler sh = new HttpHandler();
//making a request to URL and getting response
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if(jsonStr != null){
try{
JSONObject jsonObj = new JSONObject(jsonStr);
//Getting JSON Array Node
JSONArray sales = jsonObj.getJSONArray("Result");
//looping through all results
for(int i = 0; i<sales.length();i++){
JSONObject s = sales.getJSONObject(i);
String title = s.getString("title");
String description = s.getString("description");
HashMap<String,String> salesDetails = new HashMap<>();
//adding each child node to HashMap key =>value
salesDetails.put("title",title);
salesDetails.put("description",description);
//adding to array list
sales_details.add(salesDetails);
}
Log.d("TAG",sales_details.toString());
}catch(final JSONException e){
Log.e(TAG, "JSON parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"JSON parsing error: " + e.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}else{
Log.e(TAG,"Couldn't get json from server");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Check logcat", Toast.LENGTH_LONG ).show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Void result){
super.onPostExecute(result);
if(pDialog.isShowing()){
pDialog.dismiss();
}
//update parsed JSON data into ListView
ListAdapter adapter = new SimpleAdapter(GetWarehouseSales.this, sales_details,R.layout.item_listview, new String[]{
"title","description"}, new int[]{R.id.text,R.id.description});
lv.setAdapter(adapter);
}
}
}
错误:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
错误点指向此行:
pDialog = new ProgressDialog(GetWarehouseSales.this);
我想执行AsyncTask
RetrieveWarehouseSalesTask
,可以在MainActivity.java
中的GetWarehouseSalesTask.java
中找到它,但会出现NPE错误。尝试传递MainActivity上下文
@Override
protected void onCreate(Bundle savedInstanceState) {
GetWarehouseSales gws = new GetWarehouseSales(MainActivity.this);
gws.executeGWS();
}
检索上下文:
private Activity activityContext;
public GetWarehouseSales(Activity context){
this.activityContext=context;
}
private Context activityContext;
public GetWarehouseSales(Context context){
this.activityContext=context;
}
现在使用该上下文初始化您的ProgressDialog
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
或者尝试使用
pDialog = new ProgressDialog(getApplicationContext());
尝试传递MainActivity上下文
@Override
protected void onCreate(Bundle savedInstanceState) {
GetWarehouseSales gws = new GetWarehouseSales(MainActivity.this);
gws.executeGWS();
}
检索上下文:
private Activity activityContext;
public GetWarehouseSales(Activity context){
this.activityContext=context;
}
private Context activityContext;
public GetWarehouseSales(Context context){
this.activityContext=context;
}
现在使用该上下文初始化您的ProgressDialog
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
或者尝试使用
pDialog = new ProgressDialog(getApplicationContext());
这就是错误的原因:
GetWarehouseSales gws = new GetWarehouseSales();
gws.executeGWS();
创建活动实例,当执行AsyncTask
时,尝试访问上下文
看起来最简单的修复方法是将RetrieveWarehouseSalesTask
放入MainActivity
,类似于:
class MainActivity ... {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
new RetrieveWarehouseSalesTask().execute();
}
public class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,Void>{
...
}
类主活动。。。{
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
新建RetrieveWarehouseSalesTask().execute();
}
公共类RetrieveWarehouseSalesTask扩展了AsyncTask{
...
}
这就是错误的原因:
GetWarehouseSales gws = new GetWarehouseSales();
gws.executeGWS();
创建活动实例,当执行AsyncTask
时,尝试访问上下文
看起来最简单的修复方法是将RetrieveWarehouseSalesTask
放入MainActivity
,类似于:
class MainActivity ... {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
new RetrieveWarehouseSalesTask().execute();
}
public class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,Void>{
...
}
类主活动{
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
新建RetrieveWarehouseSalesTask().execute();
}
公共类RetrieveWarehouseSalesTask扩展了AsyncTask{
...
}
希望这对您有所帮助
@Override
protected void onCreate(Bundle savedInstanceState) {
GetWarehouseSales gws = new GetWarehouseSales(this);
gws.executeGWS();
}
检索上下文:
private Activity activityContext;
public GetWarehouseSales(Activity context){
this.activityContext=context;
}
private Context activityContext;
public GetWarehouseSales(Context context){
this.activityContext=context;
}
现在使用该上下文初始化ProgressDialog
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
希望这对你有帮助
@Override
protected void onCreate(Bundle savedInstanceState) {
GetWarehouseSales gws = new GetWarehouseSales(this);
gws.executeGWS();
}
检索上下文:
private Activity activityContext;
public GetWarehouseSales(Activity context){
this.activityContext=context;
}
private Context activityContext;
public GetWarehouseSales(Context context){
this.activityContext=context;
}
现在使用该上下文初始化ProgressDialog
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(activityContext);
pDialog.setMessage("Getting you the best warehouse sales...");
pDialog.setCancelable(false);
pDialog.show();
}
我真的不知道代码有什么问题,但我认为你必须实际启动活动。否则它就没有上下文。堆栈跟踪或函数示例代码会很有帮助。我真的不知道代码有什么问题,但我认为你必须实际启动活动。否则它就没有上下文t、 堆栈跟踪或函数示例代码可能会有所帮助。现在错误指向pDialog.show()。错误消息是“MainActivity已泄漏窗口”DecorView@17887f5[]最初添加到此处的内容”@kylas尝试编辑…“窗口泄漏”异常是由于您的mainactivity在显示progressdialogNow时被破坏而导致的。错误指向pDialog.show()。错误消息为“mainactivity已泄漏窗口”DecorView@17887f5[]最初添加到此处的内容”@kylas尝试编辑…窗口泄漏异常是由于您的mainactivity在显示progressdialog时被破坏而导致的