2015-11-03 124 views
0

這個問題也許之前已經問過了,但我無法通過我的搜索找到它。Android多線程,主線程不能從Asynctask訪問

我在我的android應用程序中實現了一個活動,並且我在這個活動中使用了一個Asynctask類。我嘗試從Asynctask(doInBackgroung)對我的佈局進行一些更改,因此我從提到的Asynctask中調用了runOnUiThread。這可以正常工作,但只要我移動到另一個活動並再次返回到此活動,佈局上的更改就不會再發生了。

值得一提的是,當移動到下一個活動時我調用了asynctask.cancel(true),並且在移回到包含上述Asynctask的活動時重新生成了asynctask。

請指導我如何處理這個問題。

+0

當您返回到原始任務時,您是否調用'.execute()'? https://github.com/xxv/android-lifecycle此鏈接將幫助您瞭解何時應重新實例化對象,如'AsyncTasks' – ElliotM

+0

當您在活動上調用setContentView()時,它將重新加載在xml中忽略的佈局你對UI的改變,是你的問題嗎? – Nanoc

+0

我在'onCreate()'中調用'.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,param);'在最初的活動中。我嘗試過'.execute',但它不成功。 – mohammad

回答

0

如果不查看代碼很難說,但我建議您不要在asyncTask中調用runOnUiThread()。相反,在AsyncTask類中創建一個接口,並在構建AsyncTask類時傳入實現該接口的活動。然後在onPostExecute()裏檢查你的監聽器(即實現你的接口的活動)是否爲空,並在該接口上調用一個方法 - 這將在活動內部的實現方法中,在正確的線程中進行處理,您仍然擁有正確的用戶界面元素,或者在需要時通過id找到它們。

public class MyActivity extends Activity implements OnAsyncFinishedListener { 

    <... activity stuff ...> 

    @Override 
    public void onAsyncFinished() { 
     // do stuff with your activity ui 
    } 
} 

public class MyAsyncTask extends AsyncTask<Void, Void, Void> { 
    private OnAsyncFinishedListener mListener; 

    public static interface OnAsyncFinishedListener { 
     void onAsyncFinished(); 
    } 

    public MyAsyncTask(OnAsyncFinishedListener listener) { 
     mListener = listener 
    } 

    <... async task stuff ...> 

    @Override 
    protected void onPostExecute(Void void) { 
     if (mListener != null) { 
      mListener.onAsyncFinished(); 
     } 
    } 
} 
+0

感謝您的回答。我完全不明白我的問題邏輯。我嘗試在Asynctask的doInBackground部分調用一個監聽器,因此這個Asynctask直到活動結束才完成。每次偵聽器捕捉到預期的內容時,都會在UI線程上更改一些圖標,然後再次開始偵聽事件。我必須在我的doInBackground方法中調用runOnUIthread,以管理UIthread。 – mohammad

+0

同樣,我不認爲你應該在doInBackground中調用runOnUi。這沒有任何意義。我建議你看看你是如何設計你的應用程序。應該使用AsyncTasks在後臺線程上執行有限的作業並將結果返回給主線程。如果您需要在後臺繼續工作並使用結果更新UI,我建議您使用綁定的服務並遵循上述的相同接口模式。 – vkislicins