2014-10-18 65 views
0

我有一個活動,當我點擊刷新操作欄圖標時,它啓動一個異步任務。我在mainactity中有異步任務的回調。在預先執行我正在顯示進度條上的操作欄和postexecute我顯示刷新項目。但是,當異步任務啓動後屏幕旋轉時,onpostexecute會運行,但不會調用invalidate選項菜單。onPostExecute回調不呼叫invalidateOptionsMenu

請幫我一把。

這裏是我的MainActivity:

package in.cdac.enbee; 
 
import android.app.Activity; 
 
import android.os.Bundle; 
 
import android.util.Log; 
 
import android.view.Menu; 
 
import android.view.MenuItem; 
 
import android.widget.Toast; 
 

 
public class MainActivity extends Activity implements RefreshTask.TaskCallbacks { 
 

 
\t // Our created menu to use 
 
    private Menu mymenu; 
 
\t volatile static boolean isrefreshing=false; 
 
\t 
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 
    } 
 

 

 
    @Override 
 
    public boolean onCreateOptionsMenu(Menu menu) { 
 
    \t Log.d("Debug", "OncreateOptionsMenu"); 
 
     // Inflate the menu; this adds items to the action bar if it is present. 
 
     getMenuInflater().inflate(R.menu.main, menu); 
 
     
 
     // We should save our menu so we can use it to reset our updater. 
 
     mymenu = menu; 
 
     
 
     if(isrefreshing) { 
 
     \t menu.findItem(R.id.action_refresh).setActionView(R.layout.action_progressbar); 
 
\t \t } else { 
 
\t \t \t menu.findItem(R.id.action_refresh).setActionView(null);; 
 
\t \t } 
 
     return true; 
 
    } 
 
    
 
    
 
    @Override 
 
    public boolean onOptionsItemSelected(MenuItem item) { 
 
     // Handle action bar item clicks here. The action bar will 
 
     // automatically handle clicks on the Home/Up button, so long 
 
     // as you specify a parent activity in AndroidManifest.xml. 
 
    \t 
 
     switch(item.getItemId()) { 
 
     case R.id.action_refresh: 
 
     \t // Do animation start 
 
      new RefreshTask(this).execute(); 
 
      return true; 
 
     case R.id.action_settings: 
 
     \t return true; 
 
     } 
 
     
 
     return super.onOptionsItemSelected(item); 
 
    } 
 
    
 
    
 
    @Override 
 
    protected void onSaveInstanceState (Bundle savedInstanceState) { 
 
    \t //Log.d("Debug", "OnSave"); 
 
    \t //Always call superclass first 
 
    \t super.onSaveInstanceState(savedInstanceState); 
 
    \t // Restore value of members from saved state 
 
     //savedInstanceState.putBoolean("isRefreshing", isrefreshing); 
 
     
 
    } 
 
    
 
    @Override 
 
    protected void onRestoreInstanceState (Bundle savedInstanceState) { 
 
    \t //Log.d("Debug", "OnRestore"); 
 
    \t // Always call the superclass so it can restore the view hierarchy 
 
     super.onRestoreInstanceState(savedInstanceState); 
 
     if (savedInstanceState != null) { 
 
      // Restore value of members from saved state 
 
     \t //isrefreshing = savedInstanceState.getBoolean("isRefreshing"); 
 
     } else { 
 
      // Probably initialize members with default values for a new instance 
 
     \t //isrefreshing = false; 
 
     } 
 
      
 
    } 
 
    
 
\t @Override 
 
\t public void onPreExecute() { 
 
\t \t // TODO Auto-generated method stub 
 
\t \t isrefreshing = true; 
 
\t \t invalidateOptionsMenu(); 
 
\t } 
 

 

 
\t @Override 
 
\t public void onCancelled() { 
 
\t \t // TODO Auto-generated method stub 
 
\t \t isrefreshing = false; 
 
\t \t invalidateOptionsMenu(); 
 
\t } 
 

 

 
\t @Override 
 
\t public void onPostExecute(Boolean done) { 
 
\t \t // TODO Auto-generated method stub 
 
    \t \t isrefreshing = false; 
 
\t \t 
 
\t \t if(done) { 
 
    \t \t Toast.makeText(this, "Done refreshing", Toast.LENGTH_SHORT).show(); 
 
    \t } else { 
 
    \t \t Toast.makeText(this, "Downloading Failed", Toast.LENGTH_SHORT).show(); 
 
    \t } 
 
\t \t invalidateOptionsMenu(); 
 
\t } 
 
    
 
}

和我的異步任務:

package in.cdac.enbee; 
 

 
import android.os.AsyncTask; 
 

 
public class RefreshTask extends AsyncTask<Void, Void, Boolean> { 
 
\t 
 
    /** 
 
\t * 
 
\t */ 
 
    
 
    static interface TaskCallbacks { 
 
\t \t void onPreExecute(); 
 
\t \t void onCancelled(); 
 
\t \t void onPostExecute(Boolean done); 
 
\t } 
 
    
 
    private TaskCallbacks mCallbacks; 
 
     
 
    public RefreshTask(TaskCallbacks mCallbacks) { 
 
\t \t this.mCallbacks = mCallbacks; 
 
\t } 
 
    
 
    @Override 
 
\t protected void onPreExecute() { 
 
\t \t mCallbacks.onPreExecute(); 
 
\t \t 
 
\t } 
 

 
    @Override 
 
    protected void onCancelled() { 
 
     if (mCallbacks != null) { 
 
     mCallbacks.onCancelled(); 
 
     } 
 
    } 
 
    
 
    @Override 
 
    protected Boolean doInBackground(Void... nope) { 
 
     try { 
 
      // Set a time to simulate a long update process. 
 
      Thread.sleep(4000); 
 
       
 
      return true; 
 
       
 
     } catch (Exception e) { 
 
      return false; 
 
     } 
 
    } 
 
     
 
    
 
    @Override 
 
\t protected void onPostExecute(Boolean done) { 
 
\t \t if (mCallbacks != null) { 
 
\t \t \t mCallbacks.onPostExecute(done); 
 
\t \t } 
 
\t } 
 

 
}

和progressba我的佈局文件R:

<?xml version="1.0" encoding="utf-8"?> 
 
<ProgressBar \t xmlns:android="http://schemas.android.com/apk/res/android" 
 
     \t \t android:id="@+id/progressBar" 
 
     \t \t android:layout_width="wrap_content" 
 
     \t \t \t android:layout_height="wrap_content"> 
 
</ProgressBar>

謝謝。

+0

這似乎是你的代碼的一部分缺失。 – Okas 2014-10-18 20:55:20

+0

@Okas你能告訴我哪部分代碼? – 2014-10-19 05:21:56

+0

對不起,我誤解了你的代碼。 – Okas 2014-10-19 10:07:35

回答

0

您正將您的Acitvity對象傳遞給AsyncTask。這種方法不起作用。基本上,android系統可以隨時銷燬並隨後重新創建您的活動(例如,當方向發生變化時),您必須爲這種情況做好準備。

你現在看到的是你的代碼被調用,但它使用舊的活動,而不是方向改變後創建的活動,所以你的代碼沒有效果。

+0

那麼你認爲我應該怎麼做? – 2014-10-19 10:12:47

0

我不知道這是否正確的方式,但我確實有一點解決方法,它的工作原理。

我在mainactivity中創建對RefreshTask異步任務的引用。最初使其爲空。

static RefreshTask rt=null;

然後加入在異步任務類的方法。

public void updateobject(TaskCallbacks mCallbacks) { 
 
    \t this.mCallbacks = mCallbacks; 
 
    }

和mainactivity,在onRestoreInstanceState,調用該方法。

@Override 
 
    protected void onRestoreInstanceState (Bundle savedInstanceState) { 
 
    \t //Log.d("Debug", "OnRestore"); 
 
    \t // Always call the superclass so it can restore the view hierarchy 
 
     super.onRestoreInstanceState(savedInstanceState); 
 
     if(rt != null) { 
 
     \t rt.updateobject(this); 
 
     } 
 
      
 
    }

請讓我知道你在想什麼。 另外,建議我做一個替代方法。