1

アクティビティの基本クラスと、基本クラスを拡張するサブクラスがあります。スーパークラスには、何らかのアクションを実行する非同期タスクがあります。IllegalInitializerError をスローするため、UI スレッドで実行してこれを呼び出します。

superclass.this.runOnUiThread(new Runnable() {
    public void run() {
        String p="";
        try {
            p=new asynctasker().execute().get();
        }
    }
}

私の非同期タスクでは:

protected void onPreExecute()
{
    // TODO Auto-generated method stub
    super.onPreExecute();
    //showDialog();
    Log.d("Now","Inside right now");
    dialog = ProgressDialog.show(class_create_event.this, "Loading1", "Please Wait");
}

ただし、ダイアログはリクエストのほぼ最後に表示されます。I am in part は正しく印刷されます。何かが私のUIスレッドをブロックしていることを知っています。しかし、UI スレッドから非同期タスクを呼び出さないと、不正な初期化エラーがスローされます。抜け道はありますか?

4

1 に答える 1

1

AsyncTaskを呼び出すためにUIthreadを持っている必要はありません

このように呼んでください

FetchRSSFeeds async = new FetchRSSFeeds();
async.execute();


private class FetchRSSFeeds extends AsyncTask<String, Void, Boolean> {

    private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);

    /** progress dialog to show user that the backup is processing. */
    /** application context. */

    protected void onPreExecute() {
        this.dialog.setMessage(getResources().getString(
                R.string.Loading_String));
        this.dialog.show();
    }

    protected Boolean doInBackground(final String... args) {
        try {

            // Fetch the RSS Feeds from URL
            // do background process

            return true;
        } catch (Exception e) {
            Log.e("tag", "error", e);
            return false;
        }
    }

    @Override
    protected void onPostExecute(final Boolean success) {

        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        if (success) {
            // Setting data to list adaptar
            setListData();
        }
    }
}
于 2012-10-25T05:54:01.947 に答える