onPostExecute()有时不会运行

时间:2014-08-10 19:41:12

标签: android android-asynctask

我的AsyncTask有一个奇怪的问题。如果我调用我的AsyncTask没有问题,但如果我从另一个类的静态方法调用它或在另一个对象上调用它,则onPostExecute方法不会运行。我不认为我应该发布代码,因为我不认为它是关于代码的,但如果你愿意,我可以添加它。

编辑:

使用我发布的onPostExecute代码不会调用。但是,如果我从我的活动中创建我的Bağlantı对象,它就像它应该的那样工作。

编辑:添加了代码。对不起,它有点复杂

来自名为“ExplorerActivity”的活动类:

Gönderi deneme = new Gönderi( "10|44|Deneme|12|12,24", this);

从我的班级创建名为“Gönderi”的灵活视图:

Profil gönderenProfil;

        if( Ayarlar.sProfiller.containsKey( mGönderenId ) ){

            ConnectivityManager conMgr = (ConnectivityManager) pActivity.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            NetworkInfo mobile = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

            if ( !wifi.isConnected() && !mobile.isConnected() ) 
                gönderenProfil = Ayarlar.sProfiller.get( mGönderenId );

            else
                gönderenProfil = Ayarlar.sProfiller.get( mGönderenId ).güncelle( pActivity );

        }

        else{
            gönderenProfil = new Profil( Ayarlar.sMevcutId, pActivity);

            Ayarlar.sProfiller.put( mGönderenId,  gönderenProfil);
        }

来自我的课程,其中包含个人资料信息名称“Profil”:

public Profil( String id, Activity pActivity ) {
        mID = new String( id );

        String değerler[] = new String[1];

        değerler[0] = id;

        Bağlantı2 bağlantı = new Bağlantı2( Bağlantı2.BağlantıTipi.AL_KİŞİ, değerler, pActivity );
        bağlantı.bağlan();

        do{
            //Bağlantı tamamlanana kadar bekle
        }while( bağlantı.mKullanımda );

        if( bağlantı.mSonuç != Bağlantı2.Sonuç.BAŞARILI )
            return;

        mİndirildi = true;

        String dönüt = bağlantı.mDönüt;

    ....

    }

public Profil güncelle( Activity pActivity ){


        String değerler[] = new String[1];

        değerler[0] = mID;

        Bağlantı2 bağlantı = new Bağlantı2( BağlantıTipi.AL_KİŞİ, değerler, pActivity );
        bağlantı.bağlan();

        do{
            //Bağlantı tamamlanana kadar bekle
        }while( bağlantı.mKullanımda );

        if( bağlantı.mSonuç != Bağlantı2.Sonuç.BAŞARILI )
            return this;

        mİndirildi = true;

        ...

        return this;
    }

来自名为“Bağlantı”的连接类:

public void bağlan(){

        mKullanımda = true;
        ++sAktifBağlantıSayısı;

        Log.i( TAG , "Aktif bağlantı sayısı: " + sAktifBağlantıSayısı );

        switch( mTip ){ 

                 //Deleted this part because it contains database password and url etc.     

        }

        try{
            mURL = new URL( sAnaUrl + mLink );

        }catch(MalformedURLException e1){
            mSonuç = Sonuç.BAŞARISIZ ;
            mNeden = Neden.URL;
        }


        try{
            new BağlantıTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
            }catch( Exception e ){

            }

    }

    class BağlantıTask extends AsyncTask<Void, Void, String> {

        @Override
        protected void onPreExecute() {
            //uzun islem oncesi yapilacaklar
        }

        @Override
        protected String doInBackground(Void... foo) {
            //uzun islem sirasinda yapilacaklar


            if( mSonuç == Bağlantı2.Sonuç.BAŞARISIZ ){
                return null;
            }

            ConnectivityManager conMgr = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo wifi = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            NetworkInfo mobile = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

            if ( !wifi.isConnected() && !mobile.isConnected() ) {
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.BAĞLANTIHATASI;
                return null;
            }


            try {
                HttpGet mGet = new HttpGet( mURL.toString());

                Log.w( "link" , mLink);

                mDönüt = EntityUtils.toString(mClient.execute( mGet ).getEntity(), HTTP.UTF_8 );

                Log.w( "dönüt" , mDönüt);

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.HTTP;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.HTTP;
            }

            --sAktifBağlantıSayısı;

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            //uzun islem bitince yapilacaklar

            Log.w( TAG, "onPostExecute");

            if( mDönüt == null ){
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.BAĞLANTIHATASI;
            }
            else if( mDönüt.contains( "error" ) ){
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.BELİRSİZ;
            }
            else if( mDönüt.contains( "success" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.BELİRSİZ;
            }
            else if( mDönüt.contains( "started" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.BAŞLADI;
            }
            else if( mDönüt.contains( "sent" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.GÖNDERİLDİ;
            }
            else if( mDönüt.contains( "added" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.EKLENDİ;
            }
            else if( mDönüt.contains( "changed" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.DEĞİŞTİRİLDİ;
            }
            else if( mDönüt.contains( "exist" ) ){
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.MEVCUT;
            }
            else if( mDönüt.contains( "sent" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.GÖNDERİLDİ;
            }
            else{
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.BELİRSİZ;
            }

            switch( mNeden ){

            case MEVCUT:
                Toast.makeText( mActivity.getApplicationContext(), "Eposta adresi kullanımda", Toast.LENGTH_SHORT).show();
                break;

            case BAĞLANTIHATASI:
                Toast.makeText( mActivity.getApplicationContext(), "İnternet bağlantınızı kontrol edin", Toast.LENGTH_SHORT).show();
                break;

            case URL:
                Log.i( TAG , "-url hatası");
                break;

            case HTTP:
                Log.i( TAG , "-http hatası");
                break;

            case BELİRSİZ:
                if( mTip == Bağlantı2.BağlantıTipi.GİRİŞ && mSonuç == Bağlantı2.Sonuç.BAŞARISIZ )
                    Toast.makeText( mActivity.getApplicationContext(), "Eposta ya da şifre hatalı", Toast.LENGTH_SHORT).show();

                if( mTip == Bağlantı2.BağlantıTipi.GÖNDER_GÖNDERİ && mSonuç == Bağlantı2.Sonuç.BAŞARILI )
                    Toast.makeText( mActivity.getApplicationContext(), "Gönderildi", Toast.LENGTH_SHORT).show();

                else if( mTip == Bağlantı2.BağlantıTipi.GÖNDER_GÖNDERİ )
                    Toast.makeText( mActivity.getApplicationContext(), "Gönderilemedi", Toast.LENGTH_SHORT).show();

                Log.i( TAG , "-neden belirsiz");
                break;

            case KURULMADI:
                Log.i( TAG , "-kurulmadı");
                break;
            }

            mKullanımda = false;

        }
    }

3 个答案:

答案 0 :(得分:1)

拥有一个空的catch身体是一个非常糟糕的主意。它可能导致隐藏错误。尝试使用:

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

答案 1 :(得分:1)

首先,添加&#34; printStackTrace&#34;在所有的catch语句中,可能会遇到异常。

尝试以这种方式调用AsyncTask:

BağlantıTask task = new BağlantıTask();
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

答案 2 :(得分:0)

我找到了解决问题的方法,但它对我来说似乎不是一个好的解决方案,但问题与我的代码无关,我看到有些人遇到了这个问题而没有解决方案。这是我的解决方案:

try{
    BağlantıTask task = new BağlantıTask();
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).get();
    }catch(Exception e) {
        e.printStackTrace(); 
    } 

//I have called my AsyncTask this way and put onPostExecute part in a runUiThread.


    mActivity.runOnUiThread( new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            if( mDönüt == null ){
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.BAĞLANTIHATASI;
            }
            else if( mDönüt.contains( "error" ) ){
                mSonuç = Sonuç.BAŞARISIZ;
                mNeden = Neden.BELİRSİZ;
            }
            else if( mDönüt.contains( "success" ) ){
                mSonuç = Sonuç.BAŞARILI;
                mNeden = Neden.BELİRSİZ;
                    }
        ........
     }