0

非同期タスクを介して XML から結果を取得するアクティビティがあります。これは、予測を取得しているアクティビティの私のコードです

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_prediction);

    Past = (TextView) findViewById(R.id.textView1);
    Present = (TextView) findViewById(R.id.textView2);
    Future = (TextView) findViewById(R.id.textView3);

    new GetPrediction().execute();

}       

class GetPrediction extends AsyncTask <Void, String, String> {

    ProgressDialog dialog = new ProgressDialog(Prediction.this);

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        dialog.setMessage("Getting your fortune");
        dialog.setCancelable(false);
        dialog.show();
    }

    @Override
    protected String doInBackground(Void... b) {
        // TODO Auto-generated method stub
        try
        {
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            HandlingXMLReading doingWork = new HandlingXMLReading(); // created object of default handler class
            xr.setContentHandler(doingWork);
            xr.parse(new InputSource(website.openStream()));
           past = doingWork.getPastPrediction();
           present = doingWork.getPresentPrediction();
           future = doingWork.getFuturePrediction();

    } 
        catch( Exception e)
        {
            past = e.getMessage();
            present = e.getMessage();
            future = e.getMessage();
            }
        return past;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        dialog.dismiss();
        Past.setText(result);
        Present.setText(present);
        Future.setText(future);
    }

}

}

これで問題なく動作しますが、問題は、この非同期タスクが Default ハンドラー クラスを呼び出すときに、上記のエラーが発生することです。デフォルトのハンドラー クラスで、いくつかの数値を取得するクラスのオブジェクトを作成しました。その数値を使用して XML を解析しています。しかし、そのクラス オブジェクトを削除すると、コードは正常に動作します。これがHandleXMLData.classのコードです

public class HandlingXMLReading extends DefaultHandler {

// setting up the opbject
XMLDataCollection prediction = new XMLDataCollection();

/*These next 4 lines  gives the error of 
 * cannot create the handler inside thread
 */
SelectionFuture CardNo = new SelectionFuture();
int PastCard = CardNo.pastCardNo;
int PresentCard = CardNo.presentCardNo;
int FutureCard = CardNo.FutureCardNo;


/* Method Containing the Past Prediction*/
public String getPastPrediction()
{
    return prediction.Past();
}

/* Method Containing the Present Prediction*/
public String getPresentPrediction()
{
    return prediction.Present();
}

/* Method Containing the Past Prediction*/
public String getFuturePrediction()
{
    return prediction.Future();
}

@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    super.startElement(uri, localName, qName, attributes);


     if (localName.equals("overview_prediction1")){
            String past = attributes.getValue("name");
            prediction.setPast(past);
            }

 if (localName.equals("overview_prediction2")){
        String present  = attributes.getValue("name");
        prediction.SetPresent(present);
        }

     if (localName.equals("overview_prediction3")){
        String future = attributes.getValue("name");
        prediction.SetFuture(future);
        }

}}

何が起こっているのか理解できません。前もって感謝します

4

2 に答える 2

0

AsyncTask内部で a を使用しHandlerます。は基本的に、ハンドラーが割り当てられたスレッド上の別のスレッドHandlerから投稿することを可能にします。最も簡単な方法は、内部にオブジェクトを作成するのではなく、ハンドラのオブジェクトを voidに作成することですRunnablesAsyncTaskonCreate()AsyncTask

于 2013-03-20T11:35:53.077 に答える
0

これを試して。これはあなたの問題を解決するかもしれません

private HandlingXMLReading doingWork;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_prediction);

    Past = (TextView) findViewById(R.id.textView1);
    Present = (TextView) findViewById(R.id.textView2);
    Future = (TextView) findViewById(R.id.textView3);
    doingWork = new HandlingXMLReading(); // created object of default handler class

    new GetPrediction().execute();

}       

class GetPrediction extends AsyncTask <Void, String, String> {

    ProgressDialog dialog = new ProgressDialog(Prediction.this);

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        dialog.setMessage("Getting your fortune");
        dialog.setCancelable(false);
        dialog.show();
    }

    @Override
    protected String doInBackground(Void... b) {
        // TODO Auto-generated method stub
        try
        {
            URL website = new URL(baseUrl);
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();

            xr.setContentHandler(doingWork);
            xr.parse(new InputSource(website.openStream()));
            past = doingWork.getPastPrediction();
            present = doingWork.getPresentPrediction();
            future = doingWork.getFuturePrediction();

    } 
        catch( Exception e)
        {
            past = e.getMessage();
            present = e.getMessage();
            future = e.getMessage();
            }
        return past;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        dialog.dismiss();
        Past.setText(result);
        Present.setText(present);
        Future.setText(future);
    }

}
于 2013-03-20T12:15:30.243 に答える