0

XMLからデータを再収集して表示するアクティビティを開発しています。

私はいくつかのテストを行いましたが、問題はProgressDialogの処理にあると思います。更新ボタンを押してデータをロードすると、以下のコードが機能しますが、ボタンを押さずにデータを収集しようとすると(loadData(のコメントを省略した場合) ))エラーが発生します。

したがって、問題はProgressDialogにあると思いますが、検出できません。

public class TabFeed extends ListActivity implements Callback {

    private TabFeedController controller;
    private ProgressDialog progressDialog;
    public String _feedURL;

    private final Handler progressHandler = new Handler() {
        public void handleMessage(Message msg) {
            setData();
            progressDialog.dismiss();
        }
    };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabfeed);

        controller = new TabFeedController(MainTabs.model);
        controller.addOutboxHandler(new Handler(this));
        /**  It gets the _feedURL through a Handler (TabFeedController)  */
        controller.handleMessage(TabFeedController.MESSAGE_SHOW_FEED, null, null);

        Button btn = (Button) findViewById(R.id.btnLoad);

        **//loadData();**
        btn.setOnClickListener(new OnClickListener() {          
            public void onClick(View v) {
                LinkedList<Element> data = controller.getDataFeed();
                if (data != null) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(TabFeed.this);
                    builder.setMessage("New loading?").setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            loadData();
                        }
                    })
        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();                                
                        }
                    }).create().show();                         
                } else {
                    loadData();
                }
            }
        });
    }

    private void setData(){
        this.setListAdapter(new AdapterFeedList(this, R.layout.row, 0, controller.getDataFeed()));
    } 

    private void loadData() {
        progressDialog = ProgressDialog.show(TabFeed.this,"", "Loading...", true);

        new Thread(new Runnable(){
            public void run() {
                XMLParser parser = new XMLParser(_feedURL);
                controller.setDataFeed(parser.parse());
                progressHandler.sendEmptyMessage(0);
            }
        }).start();
    }

    public boolean handleMessage(Message msg) {

        switch(msg.what) {
            case TabFeedController.MESSAGE_MODEL_GETFEED:
                runOnUiThread(new Runnable() {
                    public void run() {
                        _feedURL = TabFeedController.FEEDURL;
                    }
                });
                return true;
            }
            return false;
        }
    }
}

onClickListenerボタンの前にloadDataという行を使用してコンパイルすると、次のエラーが発生します。

10-25 01:46:17.992: ERROR/AndroidRuntime(21460): FATAL EXCEPTION: Thread-13
10-25 01:46:17.992: ERROR/AndroidRuntime(21460): java.lang.RuntimeException: java.lang.NullPointerException
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):     at ilias.XMLParser.XMLParser.parse(XMLParser.java:83)
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):     at ilias.activities.TabFeed$3.run(TabFeed.java:115)
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):     at java.lang.Thread.run(Thread.java:1019)
10-25 01:46:17.992: ERROR/AndroidRuntime(21460): Caused by: java.lang.NullPointerException
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):     at ilias.XMLParser.XMLParser.parse(XMLParser.java:36)
10-25 01:46:17.992: ERROR/AndroidRuntime(21460):     ... 2 more

それが役に立ったかどうかはわかりません。loadDataという行なしでコンパイルすると、完全に機能しますが、ボタンを押さずに最初にデータをロードしたいので、データをロードして、イベントonClickのスコープ外でprogressDialogを開始します。

ありがとう

4

1 に答える 1

0

?の「はい」ボタンをクリックしてみましたAlertDialogか?あなたは実際にそこにたどり着いたことがないように見えるからです。これは、一見したところ、エラーがそれを示しているため_feedURLですnull(変数が初期化されないことを省略していない場合)。また、機能していると言っても、実際には機能していません(setData()手動で更新した後も呼び出しません) 。 。

アップデート:

いくつかの情報が得られたので、答えを再確認できます。これ_feedURLnull、を使用しているために別のスレッドから呼び出されたかのように値を指定しているために発生しますrunOnUiThread。その呼び出しを行うと、現在のスレッドが終了するまで延期され、その瞬間にすべての不運loadData()が呼び出されているため、値は時間内にありません。ボタンを使ってそれを行うと、両方のアクションを実行するのに十分な時間があります。それが理由です。簡単な解決策は、パーツを削除することrunOnUiThreadです(ハンドラーはアクティビティ自体であるため、UIスレッドを使用しています)が、次の質問をする方がよいと思います。

なぜハンドラーを使用して変数に値を与えるのですか?

値を指定する場合は、値を指定し、ハンドラー部分をすべて削除して、次のように入力しますonCreate()

_feedURL = TabFeedController.FEEDURL;
于 2012-10-25T00:07:58.410 に答える