-1

実行後にメイン スレッド UI を更新しようとしていAsyncます。私はそれを経由して更新しようとしましonPostExecuteNullPointerException.

これが私のクラスです

public class UncheckGuestArrayAdapter extends ArrayAdapter<UncheckGuestObj> {
    private final Activity thisContext;
    private ArrayList<UncheckGuestObj> guest = new ArrayList<UncheckGuestObj>();

    // String event_id;
    private String guest_id;

    // TODO to ask about the checkin
    static class ViewHolder {
        public TextView guestName;
        public TextView guestEmail;
        public Button btnCheckIn;
    }

    public ViewHolder holder;

    private ViewHolder getHolder(View v) {
        ViewHolder holder = new ViewHolder();
        holder.guestName = (TextView) v.findViewById(R.id.tx_guest_name);
        holder.guestEmail = (TextView) v.findViewById(R.id.tx_guest_email);
        holder.btnCheckIn = (Button) v.findViewById(R.id.btnCheckIn);
        return holder;
    }

    public UncheckGuestArrayAdapter(Activity context,
            ArrayList<UncheckGuestObj> objects) {
        super(context, R.layout.row_guest_list, objects);
        this.thisContext = context;
        this.guest = objects;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        View vi = convertView;
        if (vi == null || vi.getTag() == null) {
            LayoutInflater inflater = (LayoutInflater) thisContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vi = inflater.inflate(R.layout.row_guest_list, null);
            holder = getHolder(vi);
            vi.setTag(holder);
        } else {
            holder = (ViewHolder) vi.getTag();
        }

        holder.guestName.setText(guest.get(position).guestName);
        holder.guestEmail.setText(guest.get(position).guestEmail);
        holder.btnCheckIn.setText("Check In");
        // holder.btnCheckIn.setBackgroundColor(Color.GREEN);

        holder.btnCheckIn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("you clicked", "the item at [" + position + "] position");
                guest_id = guest.get(position).guestId;
                new CheckInAsync().execute();
            }
        });

        return vi;
    }

    // Check In Async Task for executing the POST Request
    public class CheckInAsync extends AsyncTask<Void, Void, Void> {

        ProgressDialog mProgressDialog;

        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            // Create a new HttpClient and Post Header
            HttpClient httpclient = new DefaultHttpClient();

            try {

                URI uri = new URI(Constants.BASE_URL + "/events/"
                        + GuestListActivity.event_id + "/guests/" + guest_id);
                Log.e(getClass().getSimpleName(), uri.toString());
                HttpPost httppost = new HttpPost(uri);

                // Add your data
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                        2);
                // nameValuePairs.add(new BasicNameValuePair("sk", SharePref
                // .getInstance(GetEventList.this).getSessionKey()));
                Context mContext = null;
                nameValuePairs.add(new BasicNameValuePair("sk", SharePref
                        .getInstance(mContext).getSessionKey()));
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                HttpResponse response = httpclient.execute(httppost);

                int response_code = response.getStatusLine().getStatusCode();
                // HttpEntity entity = response.getEntity();
                Log.i("response code", "" + response_code);

                if (response_code == 201) {
                    Log.e("checkin status", "Checkin done");
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            return null;
        }

        protected void onPostExecute(Void result) {
            mProgressDialog.dismiss();
            holder.btnCheckIn.setText(R.string.heavy_check_mark);
            holder.btnCheckIn.setBackgroundColor(Color.MAGENTA);
            Toast.makeText(getContext(), "Checked In!", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

そして例外は

08-23 18:56:16.192: E/AndroidRuntime(11077): FATAL EXCEPTION: main
08-23 18:56:16.192: E/AndroidRuntime(11077): java.lang.NullPointerException
08-23 18:56:16.192: E/AndroidRuntime(11077):    at com.example.example.adaptor.UncheckGuestArrayAdapter$CheckInAsync.onPostExecute(UncheckGuestArrayAdapter.java:166)
08-23 18:56:16.192: E/AndroidRuntime(11077):    at com.example.example.UncheckGuestArrayAdapter$CheckInAsync.onPostExecute(UncheckGuestArrayAdapter.java:1)
08-23 18:56:16.192: E/AndroidRuntime(11077):    at android.os.AsyncTask.finish(AsyncTask.java:631)
08-23 18:56:16.192: E/AndroidRuntime(11077):    at android.os.AsyncTask.access$600(AsyncTask.java:177)

行番号 166はラインインonPostExecute

        holder.btnCheckIn.setText(R.string.heavy_check_mark);
        holder.btnCheckIn.setBackgroundColor(Color.MAGENTA);

私は間違って何をしていますか?

4

4 に答える 4

1

ホルダー オブジェクトは 1 つのアイテムに対応するため、メンバーにすることはできません。また、メンバー値を割り当てるのではなく、ローカルの ViewHolder が割り当てられます。これがどのように機能するかです。ViewHolder メンバーを削除し、

public ViewHolder ホルダー。

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        // ...
        // copy from original post
        // ...

        holder.btnCheckIn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("you clicked", "the item at [" + position + "] position");
                guest_id = guest.get(position).guestId;
                new CheckInAsync(holder).execute();
            }
        });

        return vi;
    }

    // Check In Async Task for executing the POST Request
    public final class CheckInAsync extends AsyncTask<Void, Void, Void> {

        private ProgressDialog mProgressDialog;
        private final ViewHolder holder;

        CheckInAsync(ViewHolder holder) {
            this.holder = holder;
        }

        @Override
        protected Void doInBackground(Void... params) {
              // copy from original post
        }

        protected void onPostExecute(Void result) {
            this.mProgressDialog.dismiss();
            this.holder.btnCheckIn.setText(R.string.heavy_check_mark);
            this.holder.btnCheckIn.setBackgroundColor(Color.MAGENTA);
            Toast.makeText(getContext(), "Checked In!", Toast.LENGTH_SHORT)
                    .show();
        }
    }
于 2013-08-23T12:42:33.943 に答える
1

私はあなたの ProgressDialog null と async onPreExecute メソッドのオーバーライドがあなたの例外を実装して解決すると思います。

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog = ProgressDialog.show(YourActivityName.this, "wait", "loading");
    }
于 2013-08-23T12:38:52.897 に答える
1

以下を試してください

   ViewHolder holder;
    if (vi == null || vi.getTag() == null) {
       holder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) thisContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi = inflater.inflate(R.layout.row_guest_list, null); 
        holder.guestName = (TextView) v.findViewById(R.id.tx_guest_name);
        holder.guestEmail = (TextView) v.findViewById(R.id.tx_guest_email);
        holder.btnCheckIn = (Button) v.findViewById(R.id.btnCheckIn);
        holder = getHolder(vi);
        vi.setTag(holder);
    } else {
        holder = (ViewHolder) vi.getTag();
    }
    .....

また、ドクタードライブの提案に従う必要があります

ビューへの参照がありません。したがって、ビューを更新しようとするとonPostExecuteNullPointerException.

    holder.btnCheckIn.setText(R.string.heavy_check_mark);
    holder.btnCheckIn.setBackgroundColor(Color.MAGENTA);
于 2013-08-23T12:39:13.553 に答える
0

そのメソッドは別のスレッドで実行されるため、UI を更新できません。それができるのは、UI スレッド内のものだけです。そのため、処理中に UI を更新する場合は、publishProgress を呼び出す必要があります。その後、UI スレッドが onProgressUpdate を呼び出し、そこで UI を更新できます。

適切な説明については、このスレッドを参照してください。

AsyncTask からの UpdateUI

これはまだ有効ですが、NullPointer 例外を見逃していました。上記のように t はおそらく初期化されていません。

于 2013-08-23T12:39:26.890 に答える