Android线程测试不起作用

时间:2015-02-18 00:26:12

标签: java android multithreading

您好我是android开发的初学者,我的以下测试代码存在问题:

主要活动:

package com.test.thread;

import java.util.concurrent.ExecutionException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView txt    = null;
Button btStart  = null;
Button btStop   = null;

TestClass test = null;

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

    txt     = (TextView)findViewById(R.id.txtView); 
    btStart = (Button)findViewById(R.id.bt_start);
    btStop  = (Button)findViewById(R.id.bt_stop);

    test    =  new TestClass(this, txt);

    btStop.setOnClickListener(new OnClickListener() {           
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            test.Stop();
        }
    });
    btStart.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Thread t = new Thread(){                    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try{
                        synchronized (this) {
                            wait(50);
                            runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    // TODO Auto-generated method stub
                                    while(test.isStop()){
                                        try {
                                            wait(1000);
                                        } catch (InterruptedException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                        test.DoSomeThing();                                     
                                    }
                                }
                            });
                        }               
                    }catch( InterruptedException  e)
                    {
                        e.printStackTrace();
                    }
                }
            };
            t.start();

        }
    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

TestCLas.java:

package com.tutorial.sample;

import android.content.Context;
import android.widget.TextView;
import android.widget.Toast;

public class TestClass{

private boolean stopIter    = false;
private TextView txtV       = null;
private int count           = 0;
private Context ctx         = null;

public TestClass(Context ct, TextView tv) {
    // TODO Auto-generated constructor stub
    txtV        =   tv;
    stopIter    =   false;
    count       =   0; 
    ctx         =   ct;
}
public boolean isStop() { return stopIter; }
public void Stop()
{
    Toast.makeText(ctx, "stop the test" , Toast.LENGTH_LONG).show();
    count = 0;
    txtV.setText(Integer.toString(count));
    stopIter =  true;
}
public void DoSomeThing(){
    txtV.setText(Integer.toString(count));
}

}

我想用线程管理我的activity查看器。我发布了一个帖子,以便在点击TextView按钮时修改start的文字(每秒),并在点击stop按钮时停止它。但它不起作用,它没有任何例外地崩溃。有谁可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

wait(1000);

这绝不应该在UI线程上完成。

UI线程是更新GUI的线程,并与Android通信以说明所有内容都按预期工作。当你在UI线程上有一个线程延迟时,来自android系统的消息会被阻止,并且你的app会在系统中看起来好像它已经崩溃了。