0

私のアプリケーションには、ボタン付きのアダプターがあります。このボタンの onclicklistener で、UI を変更するスレッドを開始する必要がありますが、エラーが発生します。コードは次のとおりです。

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;

    if (convertView == null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.detailnews_layout, parent,
                false);
holder.commentButton = (ImageView) convertView
                .findViewById(R.id.imageButtonComment);
convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
final View commentView=convertView;

holder.commentButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (menuPosition == false) {
                holder.commentsLayout.animate().translationY(-950)
                        .setDuration(2000);
                Runnable commentsRun = new CommentThread(position, commentView, holder);
                new Thread(commentsRun).start();
                menuPosition = true;
            } else {
                holder.commentsLayout.animate().translationY(-0)
                        .setDuration(500);
                menuPosition = false;
            }

        }
    });
public class CommentThread implements Runnable {
    private int position;
    private View convertView;
    private ViewHolder holder;

    public CommentThread(int position, View convertView, ViewHolder holder) {
        this.position = position;
        this.convertView = convertView;
        this.holder = holder;
    }

    public void run() {

        ...
    }

}

しかし、私はこのエラーがあります:

07-17 14:04:27.975: E/AndroidRuntime(950): FATAL EXCEPTION: Thread-97
07-17 14:04:27.975: E/AndroidRuntime(950): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:823)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:318)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:318)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:318)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.widget.ScrollView.requestLayout(ScrollView.java:1440)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.View.requestLayout(View.java:15473)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.ViewGroup.addView(ViewGroup.java:3208)
07-17 14:04:27.975: E/AndroidRuntime(950):  at android.view.ViewGroup.addView(ViewGroup.java:3155)
07-17 14:04:27.975: E/AndroidRuntime(950):  at com.app.FlipAdapter.addItem(FlipAdapter.java:447)
07-17 14:04:27.975: E/AndroidRuntime(950):  at com.app.FlipAdapter.access$2(FlipAdapter.java:422)
07-17 14:04:27.975: E/AndroidRuntime(950):  at com.app.FlipAdapter$CommentThread.run(FlipAdapter.java:551)
07-17 14:04:27.975: E/AndroidRuntime(950):  at java.lang.Thread.run(Thread.java:856)

スレッドの run メソッドのコードは問題なく、onClick メソッドからうまく機能します。コードを変更するにはどうすればよいですか? ありがとう

4

2 に答える 2

0

runOnUiThread を使用できます

runOnUiThread(new Runnable() {
            public void run() {
                //some jobe
            }
        });

複雑なジョブの後に UI を更新する場合は、AsyncTask を使用して UI onPostExecute を更新します。

于 2013-07-17T14:22:34.143 に答える
0

UI スレッドから UI を更新できないため、次のエラーが表示されます。

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

UI を更新する前に実行時間の長いプロセスなどを実行する必要がある場合は、Handlerまたはメソッドを使用してメイン スレッドにコールバックする必要があります。runOnUiThread

于 2013-07-17T14:13:41.687 に答える