2010-04-20 19 views
0

我有一个活动,一个接一个地调用一个线程10次。但是,如果网络速度较慢或载入的信息过多,则会发生强制关闭。在每个线程中添加睡眠是否有助于解决此问题?还是有其他解决方法吗?睡眠/在Android应用程序中等待

public void run() { 
     if(thread_op.equalsIgnoreCase("xml")){ 
       readXML(); 
     } 
     else if(thread_op.equalsIgnoreCase("getImg")){ 
       getWallpaperThumb(); 
     } 
     handler.sendEmptyMessage(0); 
    } 

    private Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
        int count = 0; 
        if (!myExampleHandler.filenames.isEmpty()){ 
          count = myExampleHandler.filenames.size(); 
        } 
        count = 5; 
        if(thread_op.equalsIgnoreCase("xml")){ 
          pd.dismiss(); 
          thread_op = "getImg"; 
          btn_more.setBackgroundResource(R.drawable.btn_more); 

        } 
        else if(thread_op.equalsIgnoreCase("getImg")){ 
          setWallpaperThumb(); 
          index++; 
          if (index < count){ 
            Thread thread = new Thread(GalleryWallpapers.this); 
            thread.start(); 

          } 
        } 
      } 
    }; 
+0

为什么不先测试网络速度,然后开始减少呼叫次数,获取一些时间,并跟踪响应需要多长时间,并且如果它们开始变得太慢,则减少一次呼叫的次数。 – 2010-04-20 02:01:13

+0

恩......我测试过了。如果我加载少于5次,那么它工作正常。超过5次通常会将其拧紧。但我真的需要加载它10次。因此,我能做什么解决方案?我已经添加了部分代码,因为我使用可运行和处理函数来启动新线程。 – Lynnooi 2010-04-20 02:38:53

回答

0

您是否收到应用程序未响应对话框(ANR)或您的应用程序组件是否关闭?

当UI looper线程从呼叫返回时间过长时,会显示ANR。只要handleMessage函数及时返回,就有10或100个线程不应该引起任何问题。

如果你真的想限制应该在一个正在运行的线程数去查查ExecutorService的

ExecutorService executorService = Executors.newFixedThreadPool(5); 
    executorService.submit(new Runnable() { 
     public void run() { 
      // This is your thread 
     } 
    }); 

您可以提交所有10个就业机会执行人的服务,他们将先后与运行一个最多5个同时运行。

+0

这些应用程序强行关闭 – Lynnooi 2010-04-20 05:20:07

+0

在这种情况下,请编辑您的帖子以包含来自logcat的堆栈跟踪。这将清楚地表明问题出在哪里。 – Prashast 2010-04-21 00:36:31

1

第一步应该是检查堆栈轨迹,它会给出有问题的线和原因。你可以使用Logcat。