2015-03-25 56 views
0

單擊按鈕時,我想顯示alertDialog顯示animationDrawable並執行asyncTask。我發現當我將dialogcontext設置爲getApplicationContext()時,應用程序崩潰,並且當我將上下文設置爲父類activity時,那麼當我在activity類中調用dismiss方法時,dialog就會被解僱;但是當我想在AsyncTask的onPostExecute中解僱它時,那麼對話並不會被駁回!下面是代碼:AsyncTask的上下文問題

public class SyncActivity extends Activity { 
    ... 
    private MessageDialogView dlg = null; // an AlertDialog showing a message 
    private Patienter dwait = null; // an AlertDialog containing an imageview showing an animation-list 
    ... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.synchro); 
     ... 
     dlg = new MessageDialogView(SyncActivity.this, getLayoutInflater()); 
     dwait = new Patienter(SyncActivity.this, getLayoutInflater()); 
     ... 
    } 
    public void synchroniser(View view) { // called when a button is clicked 
     dwait.show(); 
     new RequestTask().execute("http://192.168.1.8/impots/data/syncro/webVersAndroid/parcelles.txt"); 
    } 
    private class RequestTask extends AsyncTask<String, Void, Void> { 

     private String err = ""; 
     private boolean error = false; 
     private String[] enregs; 

     @Override 
     protected Void doInBackground(String... s_url) { 

      enregs = new String[s_url.length]; 
      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
      if(networkInfo != null) { 
       if (networkInfo.isAvailable() && networkInfo.isConnected()) { 
        System.setProperty("http.keepAlive", "false"); 
        HttpURLConnection con = null; 
        BufferedReader reader = null; 
        for (int u=0; u<s_url.length; u++) { 
         String tmp; 
         String lines = ""; 
         try { 
          URL url = new URL(s_url[u]); 
          if (url != null) { 
           con = (HttpURLConnection) url.openConnection(); 
           if (con != null && con.getResponseCode() == HttpURLConnection.HTTP_OK) { 
            InputStream in = con.getInputStream(); 
            reader = new BufferedReader(new InputStreamReader(in)); 
            boolean firstLine = true; 
            while ((tmp = reader.readLine()) != null) { 
             if (firstLine) { 
              firstLine = false; 
              lines += tmp; 
             } 
             else 
              lines += "\r\n" + tmp; 
            } 
            enregs[u] = lines; 
           } 
          } 
         } catch (MalformedURLException e) { 
          error = true; 
          err = getResources().getString(R.string.errBadUrl); 
         } catch (IOException e) { 
          error = true; 
          err = getResources().getString(R.string.errAccessError); 
         } finally { 
          if (reader != null) { 
           try { 
           reader.close(); 
           } catch (IOException e) { 
           } 
          } 
          if (con != null) 
           con.disconnect(); 
         } 
        } 
       } 
       else { 
        error = true; 
        err = getResources().getString(R.string.errNotConnected); 
       } 
      } else { 
       error = true; 
       err = getResources().getString(R.string.errNoNetwork); 
      } 
      if (!error) 
       populateDB(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      dwait.dismiss(); 
      if (error) { 
       displayError(err); 
      } 
     } 

     private void displayError(String msg) { 
      dlg.setTitre(getString(R.string.titreErrMsgBox)); 
      dlg.setMsg(msg); 
      dlg.show(); 
     } 
     ... 
     } 
    } 
    } 

Code of the dialog : 

    public class Patienter extends AlertDialog { 

     private View contenu; 
     AnimationDrawable frameAnimation = null; 

     public Patienter(Context context, LayoutInflater inflater) { 
      super(context); 
      contenu = inflater.inflate(R.layout.patienter, null); 
      setCancelable(false); 
      setCanceledOnTouchOutside(false); 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(contenu); 
      ImageView img = (ImageView)contenu.findViewById(R.id.imgWait); 
      img.setBackgroundResource(R.drawable.wait); 
      frameAnimation = (AnimationDrawable) img.getBackground(); 
      frameAnimation.start(); 
     } 

    } 

因此,如何與背景工作?

回答

1

設置您的Context in Constructor of AsyncTask &傳遞AsyncTask調用的上下文。

的AsyncTask

Show your Dialogue in onPreExecute()

Cancel您的onPostExecute()對話。

private class RunInBackground extends AsyncTask<Void, Void, Void> { 

    private ProgressDialog dialog; 
    private Context contextInsideDialogue; 

    public RunInBackground(Context activity) { 
     try { 

      this.contextInsideDialogue = activity; 

      dialog = new ProgressDialog(activity, 
        android.R.style.Theme_DeviceDefault_Light_Panel); 
      dialog.setCanceledOnTouchOutside(false); 
      dialog.setCancelable(false); 
      dialog.getWindow().setGravity(Gravity.BOTTOM); 

     } catch (Exception e) { 
     } 
    } 

    @Override 
    protected void onPreExecute() { 
     try { 
      dialog.setMessage("Please wait. . "); 
      dialog.show(); 
     } catch (Exception e) { 
     } 

    } 

@Override 
    protected void onPostExecute(Void result) { 
     try { 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 

      } 
     } catch (Exception e) { 
     } 
    } 
} 

&調用它作爲

RunInBackground task = new RunInBackground (MyActivity.this); 
    task.execute(); 
+0

對話框並沒有消除! – pheromix 2015-03-25 09:33:21

+0

發佈您的更新code.May可能是您的擴展AlertDialogue.I我已經看到你的最後一個問題在SO – 2015-03-25 09:43:39

+0

擴展AlertDialog的代碼是在我的問題發佈。 – pheromix 2015-03-25 12:12:41