0

AsyncTask でデータを SQL データベースに投稿し、アクティビティからそのデータを取得しています。

問題は、アプリが最初に起動されたときにデータベースが空であるため、データベースからデータをフェッチしようとしてクラッシュすることです。そこで、AsyncTask が完了するまでアクティビティを待機させ、データをフェッチする while() ループを作成しようとしました。私が得るのは白い画面だけで、数秒後に「応答していません」というダイアログが表示されます。

    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);
    }
}

通知機能と待機機能を使用し、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 に答える