2013-08-17 54 views
0

我有一個正在工作的異步任務,我在其中放置了一個進度對話框。問題是,當我把進度對話框中崩潰:Progres Dialog在異步任務中崩潰活動

public class CheckBeerJSON extends AsyncTask 
<String, Void, String> { 

    Context c; 
    String b; 
    private ProgressDialog Dialog = new ProgressDialog(c); 

    public CheckBeerJSON(Context context, String beer) 
    { 
     c = context; 
     b = beer; 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     return readJSONFeed(arg0[0]); 
    } 

    protected void onPreExecute() { 
     Dialog.setMessage("Checking your portfolio"); 

     Dialog.setTitle("Searching"); 
     Dialog.show(); 
    } 

    protected void onPostExecute(String result){ 

     //decode json here 
     try{ 

      JSONObject json = new JSONObject(result); 
      String status = json.getString("status"); 

      if(status.equals("no")){ 


       String message = "Beer not logged"; 
       Toast.makeText(c, message, Toast.LENGTH_SHORT).show(); 

       //clear loader image 
       LinearLayout ll = (LinearLayout) (LinearLayout)((Activity) c).findViewById(R.id.addBeerLayout); 
       ll.removeAllViews(); 

       //Add beer add button 
       LayoutInflater mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       LinearLayout addButton = (LinearLayout)((Activity) c).findViewById(R.id.addBeerLayout); 
       addButton.addView(mInflater.inflate(R.layout.addbeerbutton_layout, null)); 


      } 

      else{ 
       String message = "You have the beer!!"; 
       Toast.makeText(c, message, Toast.LENGTH_SHORT).show(); 

       //clear loader image 
       LinearLayout ll = (LinearLayout) (LinearLayout)((Activity) c).findViewById(R.id.addBeerLayout); 
       ll.removeAllViews(); 

       //inflate star rater 
       LayoutInflater mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       LinearLayout addButton = (LinearLayout)((Activity) c).findViewById(R.id.addBeerLayout); 
       addButton.addView(mInflater.inflate(R.layout.addrate_layout, null)); 

       RatingBar r = (RatingBar) ((Activity) c).findViewById(R.id.beerRatingBar); 

       //get user data 
       SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); 
       String userID = prefs.getString("userID", null); 

       //get beer rating with async task and update rate bar 
       String url = "my_other_url"; 
       String userURLComp = "u=" + userID; 
       String beerID = "&b=" + b; 

       url = url + userURLComp + beerID; 



       new GetUserRating(c,r).execute(url); 

       //add listener to bar 
       addListenerOnRatingBar(c); 









      } 


     } 
     catch(Exception e){ 

     } 

     Dialog.dismiss(); 

    } 





    private void addListenerOnRatingBar(Context view) { 
     RatingBar ratingBar = (RatingBar) ((Activity) view).findViewById(R.id.beerRatingBar); 

     ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { 
      public void onRatingChanged(RatingBar ratingBar, float rating, 
       boolean fromUser) { 

       //next async task to update online database 
       float stars = ratingBar.getRating(); 

       //get user details 
       SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c); 
       String userID = prefs.getString("userID", null); 

       //get beer id 
       String beerID = b; 

       //get rating 
       String urlRate = "r=" + String.valueOf(ratingBar.getRating()); 
       String urlUserID = "&u=" + userID; 
       String urlBeerID = "&b=" + beerID; 

       //construct url 
       String url2 = "my_url"; 

       url2 = url2 + urlRate + urlUserID + urlBeerID; 

       Log.d("addRateing", url2); 

       //async task to update rating in database 
       new UpdateRating(c).execute(url2); 





      } 
     }); 
    } 

    public String readJSONFeed(String URL) { 
     StringBuilder stringBuilder = new StringBuilder(); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(URL); 
     try { 
      HttpResponse response = httpClient.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       HttpEntity entity = response.getEntity(); 
       InputStream inputStream = entity.getContent(); 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(inputStream)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        stringBuilder.append(line); 
       } 
       inputStream.close(); 
      } else { 
       Log.d("JSON", "Failed to download file"); 
      } 
     } catch (Exception e) { 
      Log.d("readJSONFeed", e.getLocalizedMessage()); 
     }   
     return stringBuilder.toString(); 
    } 




} 

我得到的錯誤是:

08-16 21:22:34.054 10772-10772/com.beerportfolio.beerportfoliopro E/AndroidRuntime: FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.beerportfolio.beerportfoliopro/com.example.beerportfoliopro.BeerPage}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368) 
     at android.app.ActivityThread.access$600(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1330) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:155) 
     at android.app.ActivityThread.main(ActivityThread.java:5536) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.NullPointerException 
     at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142) 
     at android.app.AlertDialog.<init>(AlertDialog.java:98) 
     at android.app.ProgressDialog.<init>(ProgressDialog.java:77) 
     at com.example.beerportfoliopro.CheckBeerJSON.<init>(CheckBeerJSON.java:37) 
     at com.example.beerportfoliopro.BeerPage.onCreate(BeerPage.java:83) 
     at android.app.Activity.performCreate(Activity.java:5066) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
     ... 11 more 

回答

1

私人ProgressDialog對話框=新ProgressDialog(C);

c爲空,請嘗試下面的代碼。

private ProgressDialog Dialog; 

public CheckBeerJSON(Context context, String beer) 
{ 
    c = context; 
    Dialog = new ProgressDialog(c); 
    b = beer; 
} 
+0

謝謝你的工作!我必須等5分鐘,然後才能接受它作爲答案。當我等待時,你是否知道在用戶點擊屏幕時是否有辦法阻止對話被解散? – Mike

+1

您可以使用Dialog.setCancelable(true)來關閉對話框。 – user1571055