Android线程问题,为什么当我使用工作线程时ui仍然阻塞?

标签 android multithreading user-interface handler

package com.commonsware.android.threads;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class HandlerDemo extends Activity {
   Thread mBackground;
   ProgressBar bar;
    Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                    bar.incrementProgressBy(5);
            }
    };
    boolean isRunning = false;

    @Override
    public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);
            bar = (ProgressBar) findViewById(R.id.progress);
    }

    public void onStart() {
            super.onStart();
            bar.setProgress(0);

            mBackground = new Thread(new Runnable() {
                    public void run() {
                            try {
                                    int a = 0;
                                    for (int i = 0; i < 20 && isRunning; i++) {
                                            for (int j = 0; j < 2000; j++) {
                                                    for (int k = 0; k < 1000; k++) {
                                                            a++;
                                                    }
                                            }
                                            handler.sendMessage(handler.obtainMessage());
                                    }
                            } catch (Throwable t) {
                                    // just end the background thread
                            }
                    }
            });

            findViewById(R.id.LoginButton).setOnClickListener(
                            new OnClickListener() {
                                    public void onClick(View v) {
                                            mBackground.run();
                                    }
                            });

            isRunning = true;

    }

    public void onStop() {
            super.onStop();
            isRunning = false;
    }

我真的很困惑...

最佳答案

您需要调用 start() 而不是 run()。

public void onClick(View v) {
      mBackground.start();  //Start will spawn the Thread and then call it's run method.
}

通过在主线程中调用 run(),您将像任何普通方法调用一样阻塞在那里。

关于Android线程问题,为什么当我使用工作线程时ui仍然阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3952210/

相关文章:

Java GUI Windows 经典

android - 使用 IJKPlayer 播放时去隔行视频

javascript - 加载 HTML 网站时 android 上的窗口高度错误

c# - 带有 zedgraphs 的多种形式。当下一个开始时,一个上的行继续

java - 为什么我的进程终止?

java - 安排 TimerTask 运行一次

Android Facebook 获取所有个人资料信息

java - 适配器上的 arraylist.remove() 删除 ListView 中的错误项目

user-interface - 可以在 Flutter 中将文本写入按钮

c - 为什么SetWindowLongPtr在处理WM_CREATE消息时总是返回零?