2014-07-03 5 views
8

मैं एक यूआरएल से एक्सएमएल डेटा पढ़ रहा हूं। यह पोर्ट्रेट मोड था जब यह अच्छी तरह से काम किया। लेकिन मैं इसे लैंडस्केप मोड में बदलना चाहता था। लेकिन यह android.view प्राप्त होता है। WindowLeaked अपवाद।android.view.WindowLeaked अपवाद

कृपया मुझे इसके साथ मदद करें। अग्रिम में धन्यवाद। यह मेरा कोड है।

package com.eisuru.abc; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.pm.ActivityInfo; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    TextView tvResponse; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

     tvResponse = (TextView) findViewById(R.id.tvResponse); 
     new PostAsync().execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 


    class PostAsync extends AsyncTask<Void, Void, Void> { 
     ProgressDialog pd; XMLHelper helper;  
     @Override 
     protected void onPreExecute() { 
      pd = ProgressDialog.show(MainActivity.this, "Exchange Rates", "Loading Exchange rates values ...", true, false); 
      } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      helper = new XMLHelper(); helper.get(); 
      return null; 
      } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      StringBuilder builder = new StringBuilder(); 
      for(Exrate_values post : helper.exrates) { 

       builder.append("\n\t " + post.getDate()); 
       builder.append("\t \t\t " + post.getFrom_currency()); 
       builder.append("\t \t\t " + post.getTo_Currency()); 
       builder.append("\t \t\t " + post.getExrt_buy()); 
       builder.append("\t \t\t\t " + post.getExrt_sell()); 


       builder.append("\n"); 

     } 
       tvResponse.setText(builder.toString()); 
       pd.dismiss(); 
       } 
     } 

} 

उत्तर

21

एक गतिविधि पर एक संवाद दृश्यमान पर सेट है लेकिन उन्मुखीकरण पर गतिविधि में ही नष्ट हो जाता है बदल जाता है, तो यह लीक खिड़की त्रुटि का कारण बनता है।

विधि 1
इसलिए, आप गतिविधि के onStop या onDestroy विधि में dismiss संवाद करने की जरूरत है -:

इस स्थिति को संभालने के लिए दो तरीकों रहे हैं। उदाहरण के लिए:

@Override 
protected void onStop() { 
    super.onStop(); 

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

और गतिविधि कक्षा में संवाद को परिभाषित

ProgressDialog pd; 

इस लिंक से आपको मदद मिलेगी Handling progress dialogs and orientation changes

विधि 2
आप में गतिविधि घोषणा करने के लिए इस जोड़ने के लिए मेनिफेस्ट:

android:configChanges="orientation" 

तो यह लग रहा है बात

तरह
<activity android:label="@string/app_name" 
     android:configChanges="orientation|keyboardHidden" 
     android:name="com.eisuru.abc.MainActivity"> 

कि प्रणाली गतिविधि को नष्ट कर देता है जब विन्यास में बदलाव होता है। ConfigurationChanges देखें।

तो कॉन्फ़िगरेशन फ़ाइल में डालने से सिस्टम को आपकी गतिविधि को नष्ट करने से बचा जाता है। इसके बजाय यह onConfigurationChanged(Configuration) विधि का आह्वान करता है।

+0

आपकी उपयोगी टिप्पणी के लिए बहुत बहुत धन्यवाद। मैंने दूसरी विधि की। यह बहुत अच्छा काम किया। 'एंड्रॉयड: screenOrientation =" परिदृश्य "' ' एंड्रॉयड: configChanges =" कुंजीपटल | keyboardHidden | उन्मुखीकरण | screenLayout | uiMode | screenSize | smallestScreenSize ">' – Isuru

+0

@Isuru मुबारक मदद करने के लिए, कोडिंग का आनंद लें। –

+0

विधि 1 मेरे लिए पूरी तरह से काम किया। दिलचस्प पक्ष नोट: जब मैं खिड़की रिसाव मूल रूप से प्राप्त कर रहा था, तो मेरे मैनिफेस्ट में configChanges में पहले से ही अभिविन्यास घोषित किया गया था। – LargeGlasses

1

आप एक गतिविधि से बाहर निकलने के बाद एक संवाद दिखाने की कोशिश कर रहे हैं।

समाधान गतिविधि से बाहर निकलने से पहले example.java:183 में बनाए गए संवाद पर खारिज() को कॉल करना है, उदा। ऑन पॉज़() में। एक गतिविधि छोड़ने से पहले सभी विंडोज & संवाद बंद होना चाहिए।

या

अपने प्रकट करने के लिए इस जोड़ें:

android:configChanges="orientation|keyboardHidden 

फिर अपनी गतिविधि में यह कहीं जोड़ें:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
{ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    //ur Code 
} 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
{ 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    //ur Code 
} 
} 
0

मैं यह त्रुटि क्योंकि मैं में एक दृश्य को जोड़ने था मिल गया WindowManager.addView() का उपयोग कर मेरी सभी गतिविधियों का onResume()। समस्या को हल करने के लिए मुझे अपनी सभी गतिविधियों के onPause() में WindowManager.removeView() को कॉल करना पड़ा।

1

संवाद एक बच्चा है जो मुख्य धागे से संबंधित है और यदि आप उन्हें दिखाना या मारना चाहते हैं तो आपको इसे इस तरह ऑनयू थ्रेड पर करना होगा। मैं खंड का उपयोग कर रहा हूं और जब मैं संवाद दिखाता हूं, तो यह अपवाद प्राप्त करें। लेकिन यह विधि मुझे बचाओ।

getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      pDialog.show();//dismiss any dialog like this 
     } 
    }); 
+1

क्या आप अपना उत्तर संपादित कर सकते हैं और समझा सकते हैं कि यह समस्या का समाधान कैसे करता है? – beresfordt

संबंधित मुद्दे