0

私が抱えている問題は、PostExecute が起動していないことです。バックグラウンドのログ タグが表示されますが、PE が起動しません。

次のようなタイマーからこのタスクを呼び出しています。

      findViewById(R.id.buttonstart).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    openFile("FeedTimerTask.html");
                    Timer t = new Timer("FeedTimerTask", true);
                    timerTask = new FeedTimerTask();
                    t.schedule(timerTask, 2000, 20000);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

Runnable runme = new Runnable() {

        @Override
        public void run() {
            timestart = Calendar.getInstance().getTimeInMillis(); 
            provider.refreshNoCache();


        }
    };

     class FeedTimerTask extends TimerTask{

        @Override
        public void run() {
            try{Looper.prepare();}catch(Exception e){};
            runme.run();

        }

     }

これは、「provider.refreshNoCache();」で呼び出された dataprovider クラス内からのメイン タスクそのものです。その上:

// threaded rteftesh tasks
@SuppressWarnings("rawtypes")
public class RefreshTask extends SupportAsyncTask {

    private int errorcodecode = 0;
    private ProgressDialog dialog=null;
    private Exception mainExeption=null;
    protected  String waitMessage = "Laddar ner information..";
    private boolean useCache;

    public RefreshTask(boolean useCache) {
        this.useCache = useCache;
    }

    public void onPreExecute() {
        data = null;
        if (showSpinnerOnRefresh){
            dialog = ProgressDialog.show(context, "", waitMessage , true);
            dialog.show();
        }
    }

    protected Object doInBackground(Object... params) {
        errorcodecode = 1;
            try {
                invokeFeedRead();
                Log.e("DataProvider", "Bkgtask...");
                errorcodecode = 0;
            } catch (BrJSONException e) {
                Log.e("[ERROR]","PROVIDER "+e.getMessage());
                mainExeption = e;
                errorcodecode = 1;
            } catch (IOException e) {
                Log.e("[ERROR]","PROVIDER "+e.getMessage());
                mainExeption = e;
                errorcodecode = 2;
            } catch (Exception e) {
                Log.e("[ERROR]","PROVIDER "+e.getMessage());
                mainExeption = e;
                errorcodecode = 3;
            }

        if (errorcodecode==0){ 
        }
        return null;
    }

    @Override
    protected void onCancelled() {

        super.onCancelled();
        Log.e("DataProvider", "Cancelled...");

        if (dialog != null)
            try{dialog.dismiss();}catch(Exception e){}
        BrAlert.Show(context, "Obs", BrAppConfig.ServerError+" (timeout)", 0);
        onError_IO(new IOException("Timeout!"));
        errorcodecode=2;


    }

    @Override
    protected void onPostExecute(Object result) {
        // super.onPostExecute(result);
        Log.e("DataProvider", "PostExec...");

        if (dialog != null)
            try{dialog.dismiss();}catch(Exception e){}

        switch (errorcodecode) {
        case 0:
            onFeedLoaded();             
            cacheAge = System.currentTimeMillis();
            break;
        case 1:
            onError_DataFormat(mainExeption);
            break;
        case 2:
            onError_IO(mainExeption);
            break;
        default:
            onError_GeneralExeption(mainExeption);

        }


    }

}
4

2 に答える 2

1

onPostExecte メソッドに到達する前であっても、タスクはキャンセルされます。onPostExecute メソッドに到達する前にタスクがキャンセルされた場合。これは onPostExecute をトリガーしませんが、onCancelled メソッドをトリガーします。タスクを完了するのに十分な時間を提供してください。

于 2012-06-26T10:43:39.997 に答える
0

最後に問題を発見しました。それはスコープに関係していました。他のスレッドを呼び出すためのハンドラーが必要でした。

他の人が役立つと思われる解決策は次のとおりです。

作成時に:

                tickHandler = new Handler();
                tickTimer = new Timer();
                tickTimer.schedule(new FeedTimerTask(),
                               0,
                               50000);  //FPS

ハンドラー クラス。

    class FeedTimerTask extends TimerTask{
    private Runnable runable;

    public FeedTimerTask(){
        super();
        runable = new Runnable(){

            @Override
            public void run() {
                timestart = Calendar.getInstance().getTimeInMillis(); 
                provider.refreshNoCache();

            }

        };
    }
    @Override
    public void run() {
        tickHandler.post(runable);

    }

}
于 2012-06-27T08:43:45.933 に答える