【问题标题】:Threads problems on android. help pleaseandroid上的线程问题。请帮忙
【发布时间】:2013-05-24 03:48:39
【问题描述】:

我有一个button。在onclick 事件中,要运行一个progressDialog,然后在加载progressDialog 时运行一个AsyncTask

我的代码:

方法 OnCreate

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

principal_layout = (RelativeLayout) findViewById(R.id.principal_layout);
text_search = (TextView) findViewById(R.id.textView1);
search_button = (Button) findViewById(R.id.button1);
input_song = (EditText) findViewById(R.id.editText1);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);

search_button.setOnClickListener(new OnClickListener() {

@Override
    public void onClick(View v) {

        runOnUiThread(new Runnable() {
                public void run() {
                    pd = ProgressDialog.show(MainActivity.this, "Working..", "Loading, please wait..", true, false);
                }
            });

        handler.sendEmptyMessage(1);

    }});
}

方法处理程序(var Handler)

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        if(msg.what == 1){
            try {
                songs = new AsyncTasks().new GetSong(MainActivity.this).execute("mySong","1").get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            catch (ExecutionException e) {
                e.printStackTrace();
            }
            sendEmptyMessage(0);
        }
        else if(msg.what == 0){
            Toast.makeText(MainActivity.this, "Finished process", Toast.LENGTH_SHORT).show();

            if(pd != null && pd.isShowing()){
                pd.dismiss();
            }
        }
    }

};

代码没有产生任何错误,但接下来是如下:

当我点击按钮时,程序执行以下行:

songs = new AsyncTasks().new GetSong(MainActivity.this).execute("mySong","1").get();

,一旦完成运行,最近就会出现progressDialog。我希望它能显示单击按钮的确切时刻(没有延迟)。

【问题讨论】:

  • onClick 已经在 UI 线程上运行,所以不需要使用 runOnUiThread。此外,在这种情况下,您不需要使用 Handler:只需在 onClick 方法中创建并启动 AsyncTask 即可。不相关:尝试为您的问题选择一个标题,以便遇到相同问题的人可以轻松搜索。

标签: android multithreading progressdialog


【解决方案1】:

您可以简单明了地做到这一点:

Handler h = new Handler();
button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        pd = ProgressDialog.show(MainActivity.this, "Working..", "Loading, please wait..", true, false);
        new Thread(new Runnable() {
            public void run() {
                //Loading code
                h.post(new Runnable() {
                    public void run() {
                        pd.dismiss();
                    }
                });
            }
        }).start();
    }
});

【讨论】:

  • 这行得通。唯一的缺点是每次执行异步任务时都必须重新创建一个新线程,这会带来额外的开销。 AsyncTask 使用线程池来执行其任务,因此它可能是更好的选择,例如,如果您希望用户多次单击按钮并启动任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多