安卓如何重复调用同一个线程里的run方法?

比如在一个页面里两个按钮,点第一个,成功执行run方法里的语句,然后点第二个就没反应,要么就闪退

0

5个回答

闪退报什么错,你将代码贴出来

0
u010168422
Dustray 在下面贴出来了,闪退是因为重复开启Looper.prepare(),然后就把它删了
接近 3 年之前 回复

public class Test2Activity extends Activity implements OnClickListener {
private TextView start_text;
private EditText team_Name, music_Name;
private String get_method;
private boolean thIsStart = false;

Thread th;

@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        super.handleMessage(msg);
        Log.i("handler", "into handle");
        String result = msg.obj.toString();
        Log.i("mytag", "成功:" + result);
        // 将WebService返回的结果显示在TextView中
        start_text.setText("结果:" + result);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test2);
    start_text = (TextView) findViewById(R.id.start_text);
    team_Name = (EditText) findViewById(R.id.teamName);
    music_Name = (EditText) findViewById(R.id.musicName);

    findViewById(R.id.start_btn).setOnClickListener(this);
    findViewById(R.id.pause_btn).setOnClickListener(this);
    findViewById(R.id.continue_btn).setOnClickListener(this);

    th = new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub

            try {
                Message msg = new Message();
                FoundWebServices fws = new FoundWebServices();
                msg.obj = fws.getRemoteInfo(team_Name.getText().toString(),
                        music_Name.getText().toString(), get_method);
                handler.sendMessage(msg);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.d("mytag", e.toString());
            } finally {
            }
        }
    });

}

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

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.start_btn:
        get_method = "getSynTime";
        break;
    case R.id.pause_btn:
        get_method = "pauseMusic";
        break;
    case R.id.continue_btn:
        get_method = "continueMusic";
        break;
    }
    if (thIsStart == false) {
        thIsStart = true;
        th.start();
    } else {
        th.run();
    }

}

}


0

然后run()里面调用getRemoteInfo()方法取得web services里的方法返回值

public String getRemoteInfo(String teamName, String musicName, String methodName)
throws Exception {
String WSDL_URI = "http://10.2.5.231:8080/DanceMusicWebServices/MusicSynPort?wsdl";// wsdl的uri
String namespace = "http://services.dustray.cn/";// namespace
//methodName = "getSynTime";// 要调用的方法名称

    SoapObject request = new SoapObject(namespace, methodName);
    // 设置需调用WebService接口需要传入的两个参数mobileCode、userId
    request.addProperty("arg0", teamName);
    request.addProperty("arg1", musicName);
    // 创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapSerializationEnvelope.VER10);
    envelope.bodyOut = request;// 由于是发送请求,所以是设置bodyOut
    envelope.dotNet = false;// 是否是.net开发的webservice
    HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
    httpTransportSE.call(namespace + methodName, envelope);// 调用
    // 获取返回的数据
    SoapObject object = (SoapObject) envelope.bodyIn;
    // 获取返回的结果
    try {
        result = object.getProperty(0).toString();

    } catch (Exception e) {
        result = "失败";

    }

    return result;

}

0

我建议你应该将Thread封装成一个方法,你点击按钮不同的发送消息,在主线程中里分别处理

0
u010168422
Dustray 我想把thread放到新建的一个类里,可是不知道handler怎么处理。求教。
接近 3 年之前 回复
u010168422
Dustray 那handler也跟这个thread一起封装到那个方法里吗?
接近 3 年之前 回复

把错误信息log发出来

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
解决java Android 中同一个线程多次运行问题
在java中同一个线程只能被start()一次,当第二次start()就会报异常。但是我们的软件需求常常需要同一个线程多执行同一个方法。为此可以使用notify(),wait()方法来达到我们想要的效果。先看代码public class ThreadTest extends Thread { private static boolean flag = false; public Thr
Java中线程run方法执行无限循环,调用布尔类型数据控制线程结束。
-
Android学习之线程如何多次实现start
以为网友的解释, 最后是结论,线程结束状态要再次start的话,就只能是new一个线程了。 当然了,可以想到,要想再次start,此时必须是处于结束的状态,如何正确结束一个线程呢? https://www.cnblogs.com/greta/p/5624839.html,一个博主的文章,受益匪浅。 结束线程的三种方法, 1、使用退出标志,使线程正常退出,也就是当run方法完成后线...
多线程执行顺序以及run方法的调用
1.多线程的执行顺序先来看一个例子:public class test { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); } }输出结果:main这个例子说明一个问题:一个Java程序至少会有1个线程在运行,就如上面的main()方法,它是...
是启动线程和调用线程的run方法
public class Test { public static void main(String[] args) { Thread t=new Thread(){ public void run() { fun(); }; }; //注意
线程run方法和start方法的区别
区别 run() 只是一个普通的方法调用,不会开启新的线程。 start() 会开启新的线程,分配新的资源。里面的变量互不影响。 实例 package multithreading; public class MyThread extends Thread { String flag; public MyThread(String flag) { t
Android Thread类中方法run()与start()调用时,实际的线程运行情况!
一、Android 实现多线程的方法: 1、写一个子类继承Thread类,重写run方法。用start方法启动线程 2、写一个类实现Runnable接口,实现run方法。调用new Thread(Runnable target).start()方法来启动 二、run()方法与start()方法的实际区别: 1.Android 调用thread.run()方法,实际的运行情况是:
【Android】java 线程中的run和start神奇使用
   社会我远哥,人狠话不多!先上代码1.首先声明 一个super简单的handler    private Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.han...
java 线程的 run() 没有返回值,怎么办?
项目需求用 线程 Thread 执行一些方法后, 需要判断执行是否成功 public void run() {}run( ) 方法返回值 是空, 怎么办?解决方法 Note 使用 call() 方法 Callable接口是 jdk 5 后新增的接口 代码package com.example.thread;import java.io.IOException; import
关于线程的start调用run顺序
    1) start:  用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。  2...
线程run方法中注入service报空指针
  如果在run中注入pictureLibraryServiceImpl此时会报空指针异常,pictureLibraryServiceImpl为null如何解决,如下图 这样就解决了问题  
java中启动线程通过run方法与start放的区别
java中启动线程通过run方法与start放的区别 1.通过start方法启动线程,是真正的创建多线程,无需等待run方法里面的代码块执行完成后再执行run方法后面的代码块。此时start方法创建的线程处于就绪状态,等到得到cpu时间片后就执行run方法里面的代码块,run方法执行完成后,词线程结束。 2.通过run方法启动线程,并没有真正的创建多线程,此时还是只有一个主线程,调用run...
关于Thread的start和run方法的执行方式
今天突然想到,在主线程中启动一个子线程,在子线程执行完毕后,是否可以自动销毁的疑惑,带着问题,开始考虑编码,在编码过程中分别使用了Runnable和Thead两种不同的方式,下面先看第一中Runnable方式。 Runnable方式 class RunnableTest implements Runnable { @Override public void run(...
Java中启动线程start和run方法
一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程。但是无论哪种方法都可以通过start()和run()方法来启动线程,下面就来介绍一下他们的区别。start方法:通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。无需等待run()方法中的代码执行完毕,就可以接着执行下面的代码。此
在run方法中使用static成员变量问题
最近在写一个蓝牙的测试程序,里面定义了一个CommunicateThread 连接线程
java多线程调用run和不调用run的区别
当在java程序中创建一个线程的时候,会三种情况: 1,只运行run方法 2,先执行start,再执行run方法 3,只运行start方法 三者的区别如下: 运行方式 区别 只运行run 只运行run的时候,多个线程的执行顺序是按代码顺序执行的,只不过执行的线程是当前线程,而不是你定义的线程,比如:你在main函数里面运行了定义了线程1、
多线程锁的重复持有
同一个线程之中,一个同步方法调用了另一个同步方法,可实现锁的重复持有
线程对象调用 run方法和调用start方法区别?
线程对象调用run方法不开启线程。仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行。
多线程陷阱(不要调用run方法;静态的同步方法)
1. 从JDK1.5开始,Java提供了3种方式来创建,启动多线程:Ø  继承Thread类来创建线程类,重写run()方法作为线程执行体。Ø  实现Runnable接口来创建线程类,重写run()方法作为线程执行体。Ø  实现Callable接口来创建线程类,重写run()方法作为线程执行体。其中第一种方式效果最差,它有2点坏处:l  线程类继承了Thread类,无法在继承其他父类。l  因为每
从一个run方法的经历看线程池
测试代码 public class Test { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(newTask());
调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
Thead类中start()方法和run()方法的区别  1。start(): 我们先来看看API中对于该方法的介绍:      使该线程开始执行;Java 虚拟机调用该线程的 run 方法。      结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。      多次启动一个线程是非法的。特别是当线程已经结
java中多线程执行时,为何调用的是start()方法而不是run()方法
Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,一旦得到CPU时间片,就自动开始执行run()方法。此时不需要等待run()方法执行完也可以继续执行下面的代码,所以也由此看出run()方法并没有实现多线程。 2,r...
多线程中start()与run()方法的区别
多线程中start()与run()方法的区别 Java的线程是通过java.lang.Thread类来实现的。JVM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。 在Java当中,线程通
java多线程中start和run方法的区别
 这篇文章主要介绍了java 线程中start方法与run方法的区别详细介绍的相关资料,在java线程中调用start方法与run方法的区别在哪里? 这两个问题是两个非常流行的初学者级别的多线程面试问题,这里进行详细说明,需要的朋友可以参考下: 线程中start方法与run方法的区别 在线程中,如果start方法依次调用run方法,为什么我们会选择去调用start方法?或者在java
event loop单线程执行顺序
遇到异步会添加一个微任务,等宏任务执行完毕,就会检查是否有微任务,如果有就执行,没有的话就会执行宏任务,以此循环; 注意点1:异步会添加到微任务队列,宏任务执行完毕后执行微任务时,Promise的异步要比async的优先,所以优先执行; 注意点2:定时器的异步是在下个宏任务的开始,所有最后执行;...
Java多线程——Thread执行自己的run方法还是Runnable的run方法?
众所周知,Runnable的run方法可以交给Thread执行,如果Thread有自己的方法,那执行谁的run方法? 从Thread类可以看到,当传入Runnable对象时,运行的是Runnable的run方法。 ...
Java线程的start方法如何回调run方法
导读:面试中可能会被问到为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?Java 创建线程的方法实际上,创建线程最重要的是提供线程函数(回调函数),该函数作为新创建线程的入口函数,实现自己想要的功能。Java 提供了两种方法来创建一个线程:继承 Thread 类class MyThread extends Thread{ public void
JAVA run方法中得到线程名称
Thread.currentThread().getName()
多线程中调用run()方法和start()方法的简单区别
比如    (1) Thread t1=new Thread(); t1.run(); 和 (2) Thread t2=new Thread(); t2.start(); 若调用start,则先执行主线程的,后执行子线程的; 若调用run,相当于函数调用,按照程序的顺序执行; Thread的start才是正在开启线程,例如(2)就是开
多线程执行时为什么调用的是start()方法而不是run()方法
Thead类中start()方法和run()方法的区别 start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状态(可运行状态),此时并没有运行,一旦得到CPU时间片,就自动开始执行run()方法。此时不需要等待run()方法执行完也可以继续执行下面的代码,所以也由此看出run()方法并没有实现多线程。
debug 无法进入 run方法,多线程 debug
转自:http://www.cnblogs.com/wxwall/p/3520561.html         以前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到很多壁。但总得来说,有个好的工具总是能事半功倍。我用的工具是eclipse,在开发多线程时,其debug模式是能直接模拟多线程环境的,网上也有许多资料,但大多都不是很全。希望我能够将自己的一些...
往Runnabl线程中传值
向线程中传递数据的三种方法: 一、通过<a href="https://www.baidu.com/s?wd=%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBPymzmhmdmvcYPhNWmvfs0ZwV5Hcvrjm3rH6sPfKWUMw85HfY
关于Java中停止线程执行的方法总结
如何停止java的线程一直是开发多线程程序的一个非常头痛的问题,本文我们就来讨论一下关于Java中停止线程执行的方法,我们应该如何正确停止java中的线程。 Java中停止线程执行的方法 一、暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法。对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式。或许有人会问,为
线程中start方法与run方法的区别-java教程
线程中start方法与run方法的区别-java教程 在线程中,如果start方法依次调用run方法,为什么我们会选择去调用start方法?或者在java线程中调用start方法与run方法的区别在哪里?  这两个问题是两个非常流行的初学者级别的多线程面试问题。当一个Java程序员开始学习线程的时候,他们首先会学着去继承Thread类,重载run方法或者实现Runnable接口,实现ru
Java线程start方法和run方法的比较
首先看看run方法是怎么来的: run方法是Runnable接口的一个抽象方法: 而Thread类实现了Runnable接口,重写了run方法: run方法里面的代码很简单,如果taget不为空,就执行target里面的run方法,为空就啥也不干,那这个targert是什么呢? target就是Thread类中的一个成员属性。这个我们待会再说。 很明显,想要执行run方法...
多线程:创建Thread为什么要调用start启动,而不能直接调用run方法
最近在学习Android Service时遇到这样多线程问题。     start()方法启动线程后,整个线程处于就绪状态,等待虚拟机调度, 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。期间虚拟机是分时间片轮番调用各个线程体的。    run()方法启动是当作普通方
多线程(三)——run()方法和start()方法的区别
递归的定义: 归就是在过程或函数里调用自身。 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。 在Java递归中,为什么,为什么容易溢出,由其静态...
多线程(四)线程的同步之同步代码块
之所以会出现《多线程(四)线程的同步之线程安全问题》文章中的问题,其原因是因为run方法体不具有同步安全性:程序中有两条并发线程在修改Account对象。一个线程进入方法准备减少取钱金额,但是还没减少取钱金额时,另一个线程由于判断金额没有减少,故可以进入取钱方法体中,因而造成余额负数情况出现。 为了解决这个问题,Java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的同步方法就是同步
java线程中run和start方法的区别
java线程中run和start方法的区别 1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要
为什么java中在Thread的run方法中不能throws
个人认为,因为是throws
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java线程如何学习 java 安卓学习