【问题标题】:Calling an activity from a thread从线程调用活动
【发布时间】:2014-09-22 06:20:16
【问题描述】:

我有两节课。一个使用Thread,另一个使用Activity。

public class MainActivity extends Activity
{
    public void incrementCounter(int amount) 
    {
       counter += amount;

       Log.d("WHY", "why you no print");
    }
}

然后在 Activity 中使用计数器来满足它的需要。

另一个实现线程的类是这样的:

public class ScoreSystem implements Runnable
{
    private int count = 0;
    private MainActivity reference;

    public void run()
    {
        Looper.prepare();

        while(true)
        {
            if(count >= 100 && reference != null)
            {
                //gets inside the if statement just fine
                reference.incrementCounter(count);
                count = 0;
            }
            count++;
        }
    }
}

问题是reference.incrementCounter(count); 从未真正运行过。 引用不为空,并且指向正确的活动。我没有发布那部分代码,因为它很琐碎,不会帮助任何人,而是浪费你的时间。

如何确保我的线程调用 Activity?

【问题讨论】:

  • 有两种解决方案。您需要在 Thread 类中引用 MainActivity ,否则您需要将 incrementCounter 方法创建为静态。
  • 我有参考。如果我将incrementCounter() 移到线程之外,那么它可以工作,但不能在线程内部。
  • 你没有初始化或分配任何东西给MainActivity reference;
  • 我没有发布它以保持问题简短。我知道参考没问题。相信我,引用不为空,并且指向正确的活动。
  • 也许你可以试试:new Handler(Looper.getMainLooper()).post(new Runnable(){reference.incrementCounter(count);});

标签: java android multithreading android-activity


【解决方案1】:

您可以像 SilentKiller 所说的那样将incrementCounter() static 设置为通过一些 Handler 或通过 runOnUIThread 在 UIThread 中调用它,因为 MainActivity 来自 UIThread,这可能会导致后台线程出现问题。

类似的东西:

 runOnUiThread(new Runnable()
 {     
      public void run() 
      {
         reference.incrementCounter(count);
      }
 }

与

 public static void incrementCounter(int amount) 
 {
    // do your code
 }

并再次检查您的计数逻辑。

【讨论】:

  • 请解释runOnUiThread 的作用,它会像我的其他线程一样并行运行,还是会附加到主 UI 线程?这还会每次都创建一个新线程吗?我宁愿重用线程。请不要只是对我进行愚蠢的代码。也不要太担心static我知道它并且不需要它。
  • @klaux runOnUiThread 将在 mainThread 中运行您的程序 ..不,它不会每次都创建新线程..它只是在主线程上运行编写的程序..与处理程序一样工作..跨度>
  • @klaux 如果您看到我的第一条评论。该评论本身就是一个答案。你试过那个吗? there are two solution for this. you need MainActivity reference in your Thread class else you need to create incrementCounter method as Static.
  • @klaux 无需混淆。你随心所欲。我只是尝试在其原始线程中运行 ui 线程方法。
  • @SilentKiller 如果您阅读了我的问题或我的 cmets,您就会知道我引用了该对象。这是我最后一次这样说。
【解决方案2】:

Activity 引用 obj 始终为空。

public class ScoreSystem implements Runnable
{
    private int count = 0;
    private MainActivity reference;

    public ScoreSystem(MainActivity reference) {
        this.reference = reference;
    }

public void run()
{
    Looper.prepare();

    while(true)
    {
        if(count >= 100 && reference != null)
        {
            //gets inside the if statement just fine
            reference.incrementCounter(count);
            count = 0;
        }
        count++;
    }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多