1

インターネットから XML ファイルを解析し、その内容を TextView に表示するプロジェクトに取り組んでいます。

手順:ボタンをクリックすると、インターネットから xml をフェッチしている Prediction クラスに転送されますが、Async Progress ダイアログを追加します。コーディングにエラーはありませんが、アプリケーションを実行するとエミュレーターでは、「エラー」というキャッチ例外メッセージが表示されますが、ASync プログレス ダイアログの追加前に以前に表示されていた「情報」は表示されません。

public class Prediction extends Activity{

static final String baseUrl = "http://astroyogi.in/testandroid/Tarot/Tarot_Android.xml";
TextView tv1;
ImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.prediction);
    grabURL("http://astroyogi.in/testandroid/Tarot/Tarot_Android.xml");
    tv1 = (TextView) findViewById(R.id.tv1);
    }

public void grabURL(String url) {
    new GrabURL().execute(url);
}

private class GrabURL extends AsyncTask<String, Void, Void> {
    private ProgressDialog Dialog = new ProgressDialog(Prediction.this);
    static final String baseUrl = "http://astroyogi.in/testandroid/Tarot/Tarot_Android.xml";


    protected void onPreExecute() {
        Dialog.setMessage("Downloading source..");
        Dialog.show();
    }

    @Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub

        try{
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            Handlingpastxml doingWork = new Handlingpastxml();
            xr.setContentHandler(doingWork);  
            xr.parse(new InputSource(website.openStream()));
            String information = doingWork.getInformation();
            tv1.setText(information);
            }

        catch(Exception e){
            tv1.setText(e.getMessage());

        }
        return null;
    }


    protected void onPostExecute(Void unused) {
        Dialog.dismiss();
    }

}

}
4

6 に答える 6

1

doinBackGround is non UI thread so never update your UI in this method

更新したい場合onProgressUpdate or onPostExecute method

あなたの場合、onPostExecuteメソッドを使用してください

String information=null;

@Override
protected void onCreate(Bundle savedInstanceState) {
     //your code block
 }

 in doinBackGround method in try block    

 information = doingWork.getInformation();<---Remove `String`

protected void onPostExecute(Void unused) {
        Dialog.dismiss();

        if(information!=null&&information.trim().length!=0)
        tv1.setText(information);
    }
于 2012-05-10T10:50:54.557 に答える
1

参考までに、doInBackground()メソッド内でUIの種類の操作を(直接)表示/更新することはできません。

解決策-1:

以下の行をdoInBackground()から削除し、onPostExecute()

 tv1.setText(information);

解決策-2:

とにかくdoInBackground()内でUIを表示/更新したい場合は、この種の操作をrunOnUiThread():内に記述してください。

 runOnUiThread(new Runnable() {
            
            public void run() {
                // TODO Auto-generated method stub
                tv1.setText(information);
            }
        });
于 2012-05-10T10:52:45.587 に答える
0

new GrabURL().execute(url);書くだけでなくnew GrabURL().execute();

すでにGrabURLでオブジェクトが作成されているためです。

また、スレッドでUIを更新する場合は、ハンドラーを使用するため、ここではonPostExecuteを維持するようにしてください。

于 2012-05-10T10:49:58.553 に答える
0

コードに従う代わりに

@Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub

        try{
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            Handlingpastxml doingWork = new Handlingpastxml();
            xr.setContentHandler(doingWork);  
            xr.parse(new InputSource(website.openStream()));
            String information = doingWork.getInformation();
            tv1.setText(information);
            }

        catch(Exception e){
            tv1.setText(e.getMessage());

        }
        return null;
    }


    protected void onPostExecute(Void unused) {
        Dialog.dismiss();
    }

次のようにしてみてください

@Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub

        try{
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            Handlingpastxml doingWork = new Handlingpastxml();
            xr.setContentHandler(doingWork);  
            xr.parse(new InputSource(website.openStream()));
            String information = doingWork.getInformation();

            }

        catch(Exception e){
            String information = e.getMessage();

        }
        return information;
    }


    protected void onPostExecute(Void response) {
         tv1.setText(response);
        Dialog.dismiss();
    }
于 2012-05-10T10:52:05.853 に答える
0

UI以外のスレッドからビューを更新しないでください。メソッドdoInbackground()では、tv1.setText(information);を使用できません。

消去

tv1.setText(information); 

doInbackround()から!! 入れて

protected void onPostExecute(Void unused) {
    Dialog.dismiss();
    tv1.setText(information);

}

情報もグローバル変数である必要があります

于 2012-05-10T10:54:57.010 に答える
0

それはスレッドの問題です:

「doInBackground」メソッドにいる間は、UI スレッドにはもういません。したがって、「tv1.setText(information);」とは言えません。UIが更新されないためです。

「doInBackground」は重いタスク用です。これらのタスクが終了すると、「onPostExecute」が呼び出されます。「onPostExecute」にいるときは、UI スレッドにいて、必要に応じて UI を変更できます。

于 2012-05-10T10:47:45.543 に答える