简体   繁体   English

我如何等待完成另一个类中的asynctask?

[英]How can I wait to finish asynctask which is in another class?

I want to wait for asynctask is finished. 我要等待asynctask完成。

MainActivity.java 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 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;
}

Here is the logs : 这是日志:

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

I would like to make the following 我想做以下

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

What I should do ? 我该做什么 ? Thanks for answers. 感谢您的回答。

Put

System.out.println(totalObject) 

in onPostExecute(). 在onPostExecute()中。

You may want to add a success field to the AsyncTask, that you can set to false if it fails (in the catch) or true if it makes it through the loop. 您可能想要向AsyncTask添加一个成功字段,如果失败(在catch中),则可以将其设置为false;如果它通过循环,则可以设置为true。

Then in your onPostExecute() only print if (success) 然后在onPostExecute()中仅在(成功)打印

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM