2014-01-21 53 views
0

我想等待asynctask完成。我該如何等待完成另一課的asynctask?

MainActivity.java

public class MainActivity extends Activity { 

private List<MyObject> lst_object; 
private ObjectManager objectManager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initLayout(); 
    initVariables(); 

    objectManager = new ObjectManager(this); 

    lst_object = objectManager.getAllData(); 

    **while(!objectManager.getAsyncTaskStatus()) { 

    }** 

    System.out.println(lst_object.size() + " items"); 
    } 
} 

ObjectManager.java

public class ObjectManager { 

private Context context; 
private Cursor c_object; 
private List<MyObject> lst_object; 
private MyObject object; 

private ProgressDialog progressDialog; 
**private boolean status = false;** 

public ObjectManager(Context context) { 
    this.context = context; 
    lst_object = new ArrayList<MyObject>(); 
} 

**public boolean getAsyncTaskStatus() { 
    return !status; 
}** 

class AsyncReadingObjects extends AsyncTask<Void, Integer, String> { 
    private int totalObject; 
    @Override 
    protected void onPreExecute() { 
     initProgressBar(); 
     progressDialog.setMessage("Reading objects"); 
     System.out.println("onPreExecute finished"); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     System.out.println("doInBackground started"); 
     lst_object.clear(); 

     c_object = context.getContentResolver().query(uri_object, null, null,null,"_id ASC"); 
     totalObject = c_object.getCount(); 
     try { 
      if (c_object.moveToFirst()) { 
       for (int i = 0; i < totalObject; i++) { 
        System.out.println(i + ". ITEM"); 

        publishProgress(i); 
        c_object.moveToNext(); 
       } 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } finally { 
      c_object.close(); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     progressDialog.setMessage("Reading objects " + values[0] + "/" + totalObject); 
    } 

    @Override 
    protected void onPostExecute(String values) { 
     progressDialog.dismiss(); 
     **status = true;** 
    } 
} 

public List<Object> getAllData() { 
    AsyncReadingObjects asyncReadingObjects = new AsyncReadingObjects(); 
    asyncReadingObjects.execute(); 
    return lst_object; 
} 

下面是日誌:

01-22 00:02:16.220: I/System.out(31507): 0 items 
01-22 00:02:16.230: I/System.out(31507): onPreExecute finished 
01-22 00:02:16.230: I/System.out(31507): doInBackground started 
01-22 00:02:16.250: I/System.out(31507): 0. ITEM 
01-22 00:02:16.250: I/System.out(31507): 1. ITEM 
01-22 00:02:16.250: I/System.out(31507): 2. ITEM 
01-22 00:02:16.250: I/System.out(31507): 3. ITEM 
01-22 00:02:16.250: I/System.out(31507): 4. ITEM 
01-22 00:02:16.250: I/System.out(31507): 5. ITEM 
01-22 00:02:16.250: I/System.out(31507): 6. ITEM 
01-22 00:02:16.250: I/System.out(31507): 7. ITEM 
01-22 00:02:16.250: I/System.out(31507): 8. ITEM 
01-22 00:02:16.250: I/System.out(31507): 9. ITEM 
01-22 00:02:16.250: I/System.out(31507): 10. ITEM 
01-22 00:02:16.260: I/System.out(31507): 11. ITEM 
01-22 00:02:16.260: I/System.out(31507): 12. ITEM 
01-22 00:02:16.260: I/System.out(31507): 13. ITEM 
01-22 00:02:16.260: I/System.out(31507): 14. ITEM 
.... 
01-22 00:02:16.260: I/System.out(31507): 300. ITEM 

我想提出以下

onPreExecute finished 
doInBackground started 
0. ITEM 
1. ITEM 
2. ITEM 
3. ITEM 
4. ITEM 
5. ITEM 
6. ITEM 
.... 
300. ITEM 
300 items 

我該怎麼辦?感謝您的回答。

回答

0

System.out.println(totalObject) 

在onPostExecute()。

您可能希望向AsyncTask添加成功字段,如果失敗(在catch中),可以將其設置爲false,如果通過循環使其成功,則爲true。

然後在你的onPostExecute()只打印如果(成功)

+0

這是真的,但我想等待Activity類來完成的AsyncTask。我添加了新行,但這次在無限循環中,asynctask不會調用onPostExecute方法 – okarakose

+0

我不明白。你想AsyncTask阻止UI線程?也許你不想要一個AsyncTask。或者,也許你可以解釋你想要做什麼,當它完成時,不能在onPostExecute完成 – MikeHelland