繁体   English   中英

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

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

我要等待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

我该做什么 ? 感谢您的回答。

System.out.println(totalObject) 

在onPostExecute()中。

您可能想要向AsyncTask添加一个成功字段,如果失败(在catch中),则可以将其设置为false;如果它通过循环,则可以设置为true。

然后在onPostExecute()中仅在(成功)打印

暂无
暂无

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

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