0

これを機能させることができないようです。progressDialogの表示が終了した後、アラートダイアログを表示するにはどうすればよいですか?

ここに'いくつかの関連するコード:

progressDialog = ProgressDialog.show(MainActivity.this, "", "Loading...");

        new Thread() {
            public void run() {
                try{
                    initializer();
                } catch (Exception e) {
                    Log.e("tag", e.getMessage());
                }
                progressDialog.dismiss();
                SharedPreferences welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                welcome = welcome_pref.getString("getwelcome", "null");

                if (welcome.equals("no")) {

                }else{
                    AlertDialog welcome = new AlertDialog.Builder(MainActivity.this).show();
                    welcome.setContentView(R.layout.welcome);
                    welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                    SharedPreferences.Editor welc = welcome_pref.edit();
                    welc.putString("getwelcome", "no");
                    welc.commit();
                }
            }
        }.start();
    }

    private void initializer() {
        startMoving = (ImageView) findViewById(R.id.imMove);
        aboutApp = (ImageView) findViewById(R.id.imAbout);
        devSite = (ImageView) findViewById(R.id.imDevSite);
        movingTips = (ImageView) findViewById(R.id.imTips);
        rateApp = (ImageView) findViewById(R.id.imRate);

        start = (EditText) findViewById(R.id.etFrom);
        end = (EditText) findViewById(R.id.etTo);

        startMoving.setOnClickListener(this);
        aboutApp.setOnClickListener(this);
        devSite.setOnClickListener(this);
        movingTips.setOnClickListener(this);
        rateApp.setOnClickListener(this);

        tvabout = (TextView) findViewById(R.id.tvabout);
        tvstartmove = (TextView) findViewById(R.id.tvStart);
        tvrate = (TextView) findViewById(R.id.tvRate);
        tvdevelop = (TextView) findViewById(R.id.tvDev);
        tvmovetips = (TextView) findViewById(R.id.tvTips);

        tvabout.setShadowLayer(30, 0, 0, 0xff000000);
        tvstartmove.setShadowLayer(30, 0, 0, 0xff000000);
        tvrate.setShadowLayer(30, 0, 0, 0xff000000);
        tvdevelop.setShadowLayer(30, 0, 0, 0xff000000);
        tvmovetips.setShadowLayer(30, 0, 0, 0xff000000);

        checklistitem();

    }

    private void checklistitem() {
        SharedPreferences createlistitem_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
        checkitem = createlistitem_pref.getString("getcheck", "null");

        if (checkitem.equals("no")) {

        }else{
            SQLHandler checkitemstat = new SQLHandler(MainActivity.this);
            checkitemstat.open();
            checkitemstat.createList();
            checkitemstat.close();
            SharedPreferences setitem_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
            SharedPreferences.Editor setcheck = setitem_pref.edit();
            setcheck.putString("getcheck", "no");
            setcheck.commit();
        }
    }
}

このエラーの原因はわかっているというCan't create handler inside thread that has not called Looper.prepare()エラーが表示されますが、これを修正する方法がわかりません。

このコード行がこれを引き起こしています。

                progressDialog.dismiss();
                SharedPreferences welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                welcome = welcome_pref.getString("getwelcome", "null");

                if (welcome.equals("no")) {

                }else{
                    AlertDialog welcome = new AlertDialog.Builder(MainActivity.this).show();
                    welcome.setContentView(R.layout.welcome);
                    welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                    SharedPreferences.Editor welc = welcome_pref.edit();
                    welc.putString("getwelcome", "no");
                    welc.commit();
                }
4

3 に答える 3

1

スレッド内のUIを更新することはできません。メインスレッドを介してUIを更新することは、ハンドラーを使用する必要がある場合にのみ可能です。またはあなたはこのようにすることができます

runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                     progressDialog.dismiss();
 AlertDialog welcome = new AlertDialog.Builder(MainActivity.this).show();
                    welcome.setContentView(R.layout.welcome);
                    welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                    SharedPreferences.Editor welc = welcome_pref.edit();
                    welc.putString("getwelcome", "no");
                    welc.commit();
                }
            });
于 2012-10-26T07:04:40.373 に答える
1

runonUiThread内にアラートダイアログの表示コードを追加します。

this.runOnUiThread(new Runnable() {

                public void run() {
                    // TODO Auto-generated method stub

                }
            });

このようなもの、

}else{

 MainActivity.this.runOnUiThread(new Runnable() {

                public void run() {
                      AlertDialog welcome = new AlertDialog.Builder(MainActivity.this).show();
            welcome.setContentView(R.layout.welcome);
                }
            });


                    welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                    SharedPreferences.Editor welc = welcome_pref.edit();
                    welc.putString("getwelcome", "no");
                    welc.commit();
                }

ここで提案されている答えの1つが言うように、ワーカースレッドからUIを更新することはできません。UIを更新するときは、UIスレッドに入る必要があります。

したがって、これを行うには、ハンドラーまたはrunonUiThreadを使用する必要があります。ただし、runOnUiThreadは内部的にハンドラーを使用するため、役立つはずです。

于 2012-10-26T07:07:27.073 に答える
0
SharedPreferences welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                welcome = welcome_pref.getString("getwelcome", "null");

                if (welcome.equals("no")) {

                }else{
                    AlertDialog welcome = new AlertDialog.Builder(MainActivity.this).show();
                    welcome.setContentView(R.layout.welcome);
                    welcome_pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                    SharedPreferences.Editor welc = welcome_pref.edit();
                    welc.putString("getwelcome", "no");
                    welc.commit();
                }

このコードスニペットを外部で実行しますThread.

于 2012-10-26T07:04:13.180 に答える