3

いくつかのアクティビティがあります。

アプリのメモリが不足しています。gc.clean()すべてのアクティビティ (in onDestroy) で null 参照を試みましたlaunchMode="singleTop"が、成功しませんでした。

MAT では、同じアクティビティのオブジェクトが複数あることがわかりました。間違っていなければ、これがデフォルトの動作です。

たとえば、最初の起動時にはメイン アクティビティがあり、終了して再度起動すると、2 つのインスタンスが作成されます。

これにより、強制終了ダイアログが表示されるまで VM が拡張されます。

私のコードの例:

public class Splash extends Activity
   {
    private static Handler handler;
    private static Thread splashThread;
    private MyProgressDialog dialog;

    private Netroads netroads;

    private int debug;

    private AsyncTask<Void,Void,Void> mConnectionTask;
    private boolean checkInternetConnection = false;

    private SharedPreferences ref;
    private SharedPreferences.Editor ed;

    private boolean firstOperationKey = false;
    private boolean userPay = false;

    private String macAddress = "";

    private String answer = "";
    private String extra = "";
    private int status = Consts.STATUS_SERVER_BUSY;

    private String paymentType = "";
    private boolean paymentStatus = false;

    private String versionName = "";

    private RelativeLayout splash_layout;

    private RelativeLayout welcome_message_layout;

    private TextView welcome_message_text;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.splash_layout);

        getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

        netroads = ((Netroads)getApplicationContext());

        ref = getSharedPreferences("NETROADS",MODE_PRIVATE);
        ed = ref.edit();

        //ed.putString("userID","2");
        //ed.putBoolean("LOGOUT",false);
        //ed.commit();

        //change background by LANGUAGEMODENUMBER
        splash_layout = (RelativeLayout)findViewById(R.id.splash_layout);
        welcome_message_layout = (RelativeLayout)findViewById(R.id.welcome_message_layout);
        //welcome_message_layout = new RelativeLayout(getApplicationContext());
        welcome_message_text = (TextView)findViewById(R.id.welcome_message_text);
        //welcome_message_text = new TextView(getApplicationContext().);

        if(ref.getBoolean("LANGUAGEMODECHANGE",false))
        {        

            welcome_message_layout.setBackgroundResource(R.drawable.welcome_message);
            welcome_message_text.setText(getString(R.string.welcome));

            switch(ref.getInt("LANGUAGEMODENUMBER",Consts.DEFAULT))
            {
                case Consts.HEBREW:
                    splash_layout.setBackgroundResource(R.drawable.welcome_hebrew);
                    break;
                case Consts.ENGLISH:
                    splash_layout.setBackgroundResource(R.drawable.welcome_english);
                    break;
                case Consts.RUSSIAN:
                    splash_layout.setBackgroundResource(R.drawable.welcome_russian);
                    break;
                case Consts.ARABIC:
                    splash_layout.setBackgroundResource(R.drawable.welcome_arabic);
                    break; 
                default:
                    splash_layout.setBackgroundResource(R.drawable.bg);
                    break; 
            }//close switch
        }

        if(ref.getBoolean("LANGUAGEMODECHANGE",false))
        {
            ed.putBoolean("LANGUAGEMODECHANGE",false);
            ed.commit();
        }

        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if(wifiManager.isWifiEnabled())
        {
            WifiInfo info = wifiManager.getConnectionInfo();
            macAddress = info.getMacAddress();
        } 
        else 
        {
            wifiManager.setWifiEnabled(true);

            WifiInfo info = wifiManager.getConnectionInfo();
            macAddress = info.getMacAddress();
            wifiManager.setWifiEnabled(false);
        }

        PackageInfo pinfo;
        try {
            pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
            versionName = pinfo.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        handler = new Handler();
        splashThread = (Thread) getLastNonConfigurationInstance();
        if (splashThread != null && splashThread.isAlive()) 
        {
            dialog = MyProgressDialog.show(this,"","");
        }

    }//close onCreate

    public void onResume()
    {
        super.onResume();

        debug = 0;
        if(debug == 1)
        {
            Intent intent = new Intent(Splash.this, Main.class); 
            startActivity(intent);
            Splash.this.finish();
        }
        else
        {
            dialog = MyProgressDialog.show(this,"","");

            if(netroads.checkGPS(Splash.this))
            {
                mConnectionTask = new AsyncTask<Void, Void, Void>()
                {
                    @Override
                    protected Void doInBackground(Void... params) 
                    {
                        for(int i=0;i<3;i++)
                        {
                            HttpGet requestForTest = new HttpGet("http://m.google.com");
                            try
                            {
                                new DefaultHttpClient().execute(requestForTest);
                                checkInternetConnection = true;
                            } 
                            catch (Exception e)
                            {
                                checkInternetConnection = false;
                            }
                        }
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result)
                    {
                        dialog.dismiss();
                        mConnectionTask = null;
                        if(checkInternetConnection)
                        {
                            dialog = MyProgressDialog.show(Splash.this,"","");
                            startSplashThread();    
                        }
                        else
                        {
                            netroads.showRegularDialog(getString(R.string.connection_problem), getString(R.string.internet_connection_problem), getString(R.string.ok), Splash.this);
                        }
                    }
                };
                mConnectionTask.execute(null, null, null);
            }
            else
            {
                dialog.dismiss();
                netroads.showGPSAlert(Splash.this);
            }
        }       
    }//close onResume

    public void startSplashThread()
    {
        splashThread = new splashThread();
        splashThread.start();
    }//close splashThread

    // Save the thread
    @Override
    public Object onRetainNonConfigurationInstance() {
        return splashThread;
    }

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

        if (dialog != null) 
        {
            dialog.dismiss();
            dialog = null;
        }

        netroads.unbindDrawables(findViewById(R.id.splash_layout)); 
        System.gc();

    }//close onDestroy

    public class splashThread extends Thread 
    {   
        @Override
        public void run() 
        {
            try
            {
                if(ConnectionDetector.checkInternetConnection())
                {
                    if(ref.getString("userID","").equalsIgnoreCase("") || ref.getBoolean("LOGOUT",false))
                        firstOperationKey = true;  //first operation after download from google play
                    else
                    {
                        checkUserActive();
                        netroads.getUsersCount(Splash.this);
                    }
                    handler.post(new splashRunnable());
                }
            } 
            finally
            {
                splashThread.interrupt();
            }
        }

    }//close splashThread 

    public class splashRunnable implements Runnable
    {
        public void run() 
        {
            dialog.dismiss();
            if(firstOperationKey)
            {
                Intent intent = new Intent(Splash.this,AppDescription.class);
                startActivity(intent);
                finish();
            }
            else if(status == Consts.STATUS_OPERATION_SUCCESSFUL)
            {
                if(netroads.answerFromServerIsOK(answer))
                {
                    Intent intent = new Intent(Splash.this,Main.class);
                    startActivity(intent);
                    finish();
                }
                else
                {
                    Log.e(Consts.TAG,"STATUS = OK, ANSWER = -2 (CLEAR SESSION)");
                    clearSession();
                }       
            }
            else if(status == Consts.STATUS_USER_UNEXISTS)
            {
                clearSession();
            }
            else
            {
                netroads.answerFromServerIsOK(answer);
                netroads.serverException(Splash.this,status);
            }
        }
    }//close splashRunnable 

    public void clearSession()
    {
        ed.putBoolean("LOGOUT",true);
        ed.commit();

        startSplashThread();
    }//close clearSession

    public boolean checkUserActive()
    {
        Log.e(Consts.TAG,"checkUserActive()");

        String url = new String(Consts.SERVER + "checkUserActive");

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);

        try 
        {           
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("userID",ref.getString("userID","")));
            nameValuePairs.add(new BasicNameValuePair("MAC",macAddress));

            httppost.addHeader("appPassword",Consts.APP_PASSWORD);

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));

            HttpResponse response = httpclient.execute(httppost);
            HttpEntity httpEntity = response.getEntity();
            String xmlString = EntityUtils.toString(httpEntity);

            Log.d(Consts.TAG,xmlString);

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = factory.newDocumentBuilder();
            InputSource inStream = new InputSource();
            inStream.setCharacterStream(new StringReader(xmlString));
            Document doc = db.parse(inStream);  
            NodeList nodeList;
            boolean normalize = false;
            try
            {
                doc.getDocumentElement().normalize();
                nodeList = doc.getElementsByTagName("Client");
                normalize = true;
            }
            catch(Exception e)
            {
                nodeList = null;
            }

            if(normalize)
                if(nodeList.getLength() > 0)
                {
                    for(int i=0; i < nodeList.getLength(); i++)
                    {
                        Node node = nodeList.item(i);
                        Element firstElement = (Element) node;

                        try{
                        NodeList myNodeList = firstElement.getElementsByTagName("userID");
                        Element myElement = (Element)myNodeList.item(0);
                        myNodeList = myElement.getChildNodes();
                        Log.d(Consts.TAG,"checkUserActive - userID:"+myNodeList.item(0).getNodeValue());

                        myNodeList = firstElement.getElementsByTagName("status");
                        myElement = (Element)myNodeList.item(0);
                        myNodeList = myElement.getChildNodes();
                        status = Integer.parseInt(myNodeList.item(0).getNodeValue());

                        myNodeList = firstElement.getElementsByTagName("answer");
                        myElement = (Element)myNodeList.item(0);
                        myNodeList = myElement.getChildNodes();
                        answer = myNodeList.item(0).getNodeValue();

                        myNodeList = firstElement.getElementsByTagName("extra");
                        myElement = (Element)myNodeList.item(0);
                        myNodeList = myElement.getChildNodes();
                        extra = myNodeList.item(0).getNodeValue();
                        Netroads.paymentKey = extra;

                        }catch(Exception e){e.printStackTrace();}

                    }//close for
                    return true;
                }//close if

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }

        return false;
    }//close checkUserActive    

    @Override
    protected void onActivityResult(int requestCode,int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        //if user is google play, paypal,...
        if(resultCode == Consts.PAYMENT_STATUS_IAP)
        {
            Log.e(Consts.TAG,"onActivityResult() - Splash");

            try
            {
                paymentStatus = data.getExtras().getBoolean("paymentStatus");
            }
            catch(Exception e){paymentStatus = false;}

            if(paymentStatus)
            {
                paymentType = data.getExtras().getString("paymentType");
                netroads.startSetUser(Splash.this,paymentType,"1","2",macAddress,versionName,ref.getString("userID",""));//TODO Chane to auto function
            }
            else
            {
                netroads.showRegularDialog(getString(R.string.netroads_server),getString(R.string.user_cancel_purchase),getString(R.string.ok),Splash.this);
            }
        }

    }//close onActivityResult      




}//close Splash

漏れはどこですか?

編集:

写真は次のとおりです。 ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

-1

Context 参照を解放していない WifiManager に関連する可能性はありますか? http://code.google.com/p/android/issues/detail?id=43945

于 2014-10-12T17:13:03.840 に答える