0

ocCreate メソッド中に JSON および XML データを解析するために使用している asynctask があります。問題は、非同期タスクが「バックグラウンドで行う」作業を 10 回に 1 回しか終了しないことです。バックグラウンド作業の完了に失敗すると、変数がバックグラウンド プロセスでインスタンス化されず、実行後に参照されるため、アプリがクラッシュします。AsyncTask がバックグラウンド作業を終了すると、すべて正常に動作するため、これは非常に奇妙です。どんな助けでも大歓迎です

マイコード

 private class LoadingData extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... sUrl) {

            //TWITTER
            //Parses Twitter XML with no problem...

publishProgress(15,1);

//SPOT GOLD AND SILVER

                try{
                    GoldSpotPriceReader.feed = "http://feed43.com/437361835043234.xml";//Gold
                    GoldSpotPriceReader.getLatestRssFeed();
                    livespotgold=GoldSpotPriceReader.spotprice;
                    storedspotgold=livespotgold;

                    SilverSpotPriceReader.feed = "http://feed43.com/824383110654537.xml";//Silver
                    SilverSpotPriceReader.getLatestRssFeed();
                    livespotsilver=SilverSpotPriceReader.spotprice;
                    storedspotsilver=livespotsilver;
                }catch(NumberFormatException e){    
                    Log.e("Spot Price Initial", "Spot Price Format Error "+e.toString());
                } 
//AsyncTask Usually Ends Here For No Particular Reason.
    //And doesn't finish background work...                 
publishProgress(30,2);

//More background work...           

 @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog (MyActivity.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        //dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMessage("Fetching Latest News");          
        dialog.setIndeterminate(false);
        dialog.setMax(100);
        dialog.setProgress(0);
        dialog.show();

        finddealer = (MapView) findViewById(R.id.mvFindDealer);
        finddealer.setBuiltInZoomControls(true);

        Touchy tango = new Touchy();
        overlayList = finddealer.getOverlays();
        overlayList.add(tango);
        compass = new MyLocationOverlay(MyActivity.this, finddealer);
        overlayList.add(compass);
        controller = finddealer.getController();
        controller.setZoom(11);

        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(lm.GPS_PROVIDER, 300000, 5000, MyActivity.this);
        crit = new Criteria();
        towers = lm.getBestProvider(crit, false);
        location = lm.getLastKnownLocation(lm.GPS_PROVIDER);

        delta = getResources().getDrawable(R.drawable.map_pin_48);
        zulu = getResources().getDrawable(R.drawable.ic_launcher);
    }

@Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        dialog.setProgress(progress[0]);
        switch (progress[1])
        {
            case 1:
                dialog.setMessage("Acquiring  Prices...");
                break;
            case 2:
                dialog.setMessage("Acquiring  Rates...");
                break;
            case 3:
                dialog.setMessage("Acquiring More Rates...");
                break;
            case 4:
                dialog.setMessage("Pinpointing Your Location...");
                break;
            case 5:
                dialog.setMessage("Locating Nearest  Dealers...");
                break;
            case 6:
                dialog.setMessage("Calculating Shortest Routes...");
                break;
            case 7:
                dialog.setMessage("Mapping  Dealers...");
                break;
            case 8:
                dialog.setMessage("Finalizing...");
                break;
        }
    }               

  @Override     
    protected void onPostExecute(String result) {       
        super.onPostExecute(result);
        dialog.setProgress(100);
        dialog.setMessage("Load Complete.");
        dialog.dismiss();

 //Other UIthread variables...
}
4

2 に答える 2

0

これらはネットワーク接続機能であるため、問題は.getLatestRssFeed()メソッドにあると思います。それらのコードは表示されませんが、おそらくフィードにアクセスするためにそれらの新しいスレッドを生成していると思いますが、引き続き and に値を割り当てようとしますが、まだ設定AsyncTaskされていません。最初にこれを修正してから、まだ問題があるかどうかを確認する必要があります。liveSpotSilverGold

AsyncTaskこれが問題でなくても、ネットワーク エラーが発生してハングする場合は、10 回中 9 回終了しません。ネットワーク接続に問題がありますSilverSpotPriceReaderとで新しいスレッドを生成するGold...場合は、既に非同期で作業を行っているため、その必要はありません。他の人が提案したようにスローされた例外をキャッチすることで、より適切にデバッグできます。

于 2013-01-27T20:53:27.820 に答える