Android AsyncTask状态循环

时间:2012-09-27 10:42:15

标签: android database android-asynctask

我有一个AsyncTask将数据发布到sql db中,然后从活动中获取该数据。

问题是,因为当应用程序首次启动时数据库为空它会在尝试从中获取内容时崩溃。所以我尝试创建一个while()循环,使活动等到AsyncTask完成,然后获取数据。我得到的只是一个白色屏幕,几秒钟后“无响应”对话框:

    MyAsyncTask task = new MyAsyncTask(this, country, img);
    task.execute(); 

    SetSql mydb = new SetSql(this);
    mydb.open();

    while(task.getStatus()!=AsyncTask.Status.FINISHED){
        //wait
    }

    countryCode = mydb.getLatestCode();
    Log.e("debug", countryCode);
    mydb.close();

无论如何我使用数据库的原因是因为我无法找到从AsyncTask发回简单字符串的方法,有没有办法从postExecute中做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为您可以创建自己的onTaskDone界面,如下所示:

public class TaskTest extends AsyncTask<String, Integer, String> {

    interface TaskDoneListener {
        abstract void onTaskDone(String result);
    }

    private TaskDoneListener t;

    public TaskTest(TaskDoneListener t){
        this.t = t;
    }

    @Override
    protected String doInBackground(String... params) {
        // do your stuf
        return "some thing";
    }

    @Override
    protected void onPostExecute(String result) {
        t.onTaskDone(result);
        super.onPostExecute(result);
    }
}

您可以使用notify和wait函数,并使用onTaskDone来通知正在等待结果的某种Thread。

修改

在onTaskDone方法中执行此代码:

countryCode = mydb.getLatestCode();
Log.e("debug", countryCode);
mydb.close();

编辑2:

活动示例代码:

public class TestActivity extends Activity implements TaskDoneListener {
    /** Called when the activity is first created. */

    TaskTest task;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //create your layout and stuff
    }


    @Override
    protected void onStart() {
        super.onStart();

        //Dont start you task in the onCreate this could cause some weird behavior
        //if the onCreate method is not yet done but your task is.
        task = new TaskTest((TaskDoneListener) this, ##country_code?##, ##image?##);
        task.execute();
    }


    public void onTaskDone(String result) {
        //set the results in your created views

    }

}

罗尔夫