为android编程时的多线程问题
Posted
技术标签:
【中文标题】为android编程时的多线程问题【英文标题】:MultiThreading issues while programing for android 【发布时间】:2011-01-04 10:44:10 【问题描述】:我正在 android 上开发,但这个问题在任何其他 Java 平台上可能同样有效。
我开发了一个多线程应用程序。假设我有一个需要执行时间密集型任务的头等舱,因此这项工作是在另一个线程中完成的。 完成后,同一个线程会将耗时的任务结果返回给另一个(第 3 类)类。
最后一个类将做一些事情并将其结果返回给第一个开始类。 我注意到虽然头等舱会一直在等待,也许是因为这是某种循环?
我还希望 Thread 类自行停止,因为当它将结果传递给第三个类时,它应该简单地停止。第三类必须在不被“封装”在第二类(线程一)中的情况下完成它的工作。 有谁知道如何做到这一点?
现在的经验是第一个似乎在等待(挂起)直到第二个和第三个完成:(
【问题讨论】:
【参考方案1】:如果你想使用线程而不是AsyncTask
,你可以这样做:
private static final int STEP_ONE_COMPLETE = 0;
private static final int STEP_TWO_COMPLETE = 1;
...
private doBackgroundUpdate1()
Thread backgroundThread = new Thread()
@Override
public void run()
// do first step
// finished first step
Message msg = Message.obtain();
msg.what = STEP_ONE_COMPLETE;
handler.sendMessage(msg);
backgroundThread.start();
private doBackgroundUpdate2()
Thread backgroundThread = new Thread()
@Override
public void run()
// do second step
// finished second step
Message msg = Message.obtain();
msg.what = STEP_TWO_COMPLETE;
handler.sendMessage(msg);
backgroundThread.start();
private Handler handler = new Handler()
@Override
public void handleMessage(Message msg)
switch(msg.what)
case STEP_ONE_COMPLETE:
doBackgroundUpdate2();
break;
case STEP_TWO_COMPLETE:
// do final steps;
break;
您可以通过调用doBackgroundUpdate1()
来启动它,完成后它会向handler
发送一条消息,从而启动doBackgroundUpdate2()
等。
【讨论】:
【参考方案2】:老虎,
老虎写道:
当它完成后,同一个线程将 返回耗时任务结果 到另一个(第三)班
由于线程异步运行,因此您的非线程类无法与您的线程同步 虽然要对 Activity 执行某些操作,但您需要 AsyncTask 而不是线程
老虎写道:
也许是因为这是某种 循环?
Tiger 确实阅读了有关 Threads 和 concurrency 的更多信息
所以我现在给你的唯一答案是ASYNCTASK
编辑:
我也希望 Thread 类停止 自己
阅读这篇文章的how-do-you-kill-a-thread-in-java
【讨论】:
thansk 到目前为止,我一直在使用 AsyncTask,但它不适合我的需求,因为它更多地用于单个任务,同时可以选择更新 GUI。我需要一个更面向对象(复杂)的案例,其中几个类(和这些类的对象)相互交互并且仍然相互引用并且还能够更新 GUI...个人处理程序更适合.. . TiGer 你可以从你的线程中调用一个方法并让该方法调用其他类的方法然后使用你的应用程序类中指定的一些全局处理程序来更新任何类的 UI【参考方案3】:在普通的 Java 中,你会这样做:
class MyTask implements Runnable
void run()
for (int i = 0; i < Integer.MAX; i++)
if (i = Integer.MAX -1)
System.out.println("done");
class MyMain
public static void main(String[] argv)
for (int i = 0; i < 10; i++)
Thread t = new Thread(new MyTask());
t.start();
System.out.println("bye");
...启动 10 个线程。请注意,如果您不小心调用了 t.run() 而不是 t.start(),您的可运行对象将在主线程中执行。可能您会在 10 点“完成”之前看到“再见”。请注意,当您提供给线程的 Runnable 的 run() 方法完成时,线程会“停止”。
我希望这可以帮助您了解您必须协调的内容。
并发的棘手部分是让线程相互通信或共享对对象的访问。
我相信 Android 以Handler
的形式为此提供了一些机制,在designing for responsiveness 下的开发人员指南中进行了描述。
Java Concurency in Practice 是一本关于 Java 并发主题的优秀书籍。
【讨论】:
【参考方案4】:如果你想使用 AsyncTask
而不是在 android 中使用线程
我已经使用ASyncTask
和 Android 中的 Handler 解决了它,目的是在编译一个任务后执行一个任务听到的是代码显示在编译该过程后首先在视图上加载动画它将进入另一个页面
class gotoparent extends AsyncTask<String,String,String>
@Override
protected String doInBackground(String... params)
runOnUiThread(new Runnable()
@Override
public void run()
Animation animation= AnimationUtils.loadAnimation(getApplicationContext(),R.anim.rotete);
lin2.startAnimation(animation);
);
return null;
@Override
protected void onPostExecute(String s)
super.onPostExecute(s);
new Handler().postDelayed(new Runnable()
@Override
public void run()
Intent i=new Intent(getApplicationContext(),ParentsCornor.class);
startActivity(i);
, 1200);
【讨论】:
以上是关于为android编程时的多线程问题的主要内容,如果未能解决你的问题,请参考以下文章