0

我有一个 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 中做到这一点?

4

1 回答 1

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 通知某种正在等待结果的线程。

编辑:

在 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

    }

}

罗尔夫

于 2012-09-27T10:58:44.573 回答