3

ビューを膨らませるコードに取り組んでいます.ユーザーが1つのビューをクリックすると、URLの解析を実行する必要があり、解析が返されることを確認します. 問題は、例外を取得しないように asynctask 解析で行う必要があることと、タスクの終了前にチェックを行うことです。

ビューをパラメーターとして AsyncTask に送信し、すべてのコードを Asynctask に送信するのが理想的です。しかし、これを最後にする方法はそうではありません

分かりやすいようにコードを載せておきます。

vMens.setOnClickListener(new View.OnClickListener() {

    public void onClick(View vMens) {
        int readOK=0;
        try{
            new taskMensaje(vMens).execute();

            if(mess_gest.equals("1")){
                readOK=1;
            }else{
                readOK=0;
            }
        }catch(Exception e){
            Utils.showDialog(Calendario.this, "Error", "No se puede gestionar el mensaje");
        }
            if (readOK==0){
                Mess.state = message.get(vMens.getId()).p1;
                Mess.tittle = message.get(vMens.getId()).p2;
            else{
                //message no gest
            }
    }
});
private class taskMensaje extends AsyncTask<String, Void, View> {

    @Override
    protected String doInBackground(String... params) {
        MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest);
        gestionables = parserMensGest.parse();

        mess_gest = gestionables.get(0).p0;
        return "";
    }
}

この問題を解決するアイデアはありますか?

私の悪い英語に感謝し、申し訳ありません

4

4 に答える 4

7

これをパラメーターとしてコンストラクターに配置し、AsyncTask オブジェクトに格納できます。WeakReference として保存し、onPostExecute で確認します。これは、http://developer.android.com/training/displaying-bitmaps/process-bitmap.html の公式ドキュメントから画像を表示するベスト プラクティスと同じです

private class TaskMensaje extends AsyncTask<String, Void, Void> {
   private WeakReference vRef;
   ... / your other stuff here   

   public TaskMensaje (View v) {
       vRef = new WeakReference(v);
   }


    @Override
    protected String doInBackground(String... params) {
        MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest);
        gestionables = parserMensGest.parse();

        mess_gest = gestionables.get(0).p0;
        return null;
    }

    @Override
    protected onPostExecute(Void result) {
        if (vRef != null && bitmap != null) {
           final ImageView imageView = vRef.get();
           if (imageView != null) {
               // Do whatever you want with your ImageView
               ...
           }
       }
    }
}

ところで、クラス定義でジェネリック引数を使用する方法については、AsyncTask ref ドキュメントを参照してください ;-) http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-10-31T14:50:26.913 に答える
1

非同期タスクでコンストラクターを作成できます。これにより、ビューを渡し、必要に応じて asynctask で使用できます。

以下のように

private class taskMensaje extends AsyncTask<String, Void, String> {

    private View _view 
    public taskMensaje(View view){
        this._view = view; // this you can use ahead wherever required
    }

    @Override
    protected String doInBackground(String... params) {
        MensajeriaGestionablePARSER parserMensGest = new MensajeriaGestionablePARSER(urlMensGest);
        gestionables = parserMensGest.parse();

        mess_gest = gestionables.get(0).p0;
        return "";
    }
}
于 2012-10-31T13:59:29.670 に答える
1

Viewにパラメーターとして送信する場合AsyncTask、短い答えはDON'Tです。

ビューが行き来し、AsyncTask終了するまでにかなりの可能性があり、あなたViewはすでに死んでいて、そこにアクセスしようとしても、悲しみと欲求不満以外には何も与えられません.

データを非同期的に処理するための適切なパターンは、別のデータ処理クラスを作成することObservableですAsyncTasksViewこれはObserver、更新を受信するように登録し、データが処理されてコールバック経由で渡されるまで待機しますupdate()

AsyncTask意図的にUIからデータ処理を分離するように作られていることを覚えておいてください。それをバインドしようとするのは完全に非論理的です。

于 2012-10-31T14:15:09.180 に答える
0

これを試して

 vMens.setOnClickListener(new View.OnClickListener() {

        public void onClick(View vMens) {
            int readOK=0;
            try{
                new taskMensaje().execute(vMens);

                if(mess_gest.equals("1")){
                    readOK=1;
                }else{
                    readOK=0;
                }
            }catch(Exception e){
                Utils.showDialog(Calendario.this, "Error", "No se puede gestionar el mensaje");
            }
                if (readOK==0){
                    Mess.state = message.get(vMens.getId()).p1;
                    Mess.tittle = message.get(vMens.getId()).p2;
                else{
                    //message no gest
                }
        }
    });

private class taskMensaje extends AsyncTask<View, Void, String> {



     @Override
        protected String doInBackground(View... params) {
           //Do what ever you want to do with this view
    View v=params[0];
            return "";
        }
    }
于 2012-10-31T14:10:13.013 に答える