我的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;
}
}
答案 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;
}
........
}