2012-04-04 9 views
5

Tôi vừa công bố ngày hôm qua ứng dụng Android đầu tiên của tôi. Tôi không thử nghiệm trên Android 4.0 và bạn tôi vừa nói với tôi rằng ứng dụng của tôi bị treo trên thiên hà S2 (4.0.3)Ứng dụng của tôi hoạt động trên android 2.3.3 đến android 3.1 nhưng dừng lại với lỗi trên 4.0 +

Nó bị treo sau vài giây trong hoạt động màn hình giật gân của tôi, chỉ một vài dòng đang có lẽ các bạn có thể kiểm tra xem nó:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splashscreen); 

    try 
    { 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
    overridePendingTransition(0 , 0); 

    // thread for displaying the SplashScreen 
    Thread splashTread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       int waited = 0; 
       while(_active && (waited < _splashTime)) { 
        sleep(100); 
        if(_active) { 
         waited += 100; 
        } 
       } 
      } catch(InterruptedException e) { 
       // do nothing 
      } finally { 
       // finish(); 

       try 
       { 
        /* 
        Intent i = new Intent(); 
        i.setClass(SplashScreen.this, MainActivity.class); 
        startActivity(i); 
        finish(); 
        */ 
       } 
       catch(Exception e) 
       { 
        ki(e); 
       } 

       stop(); 
      } 
     } 
    }; 

    splashTread.start(); 

    } 
    catch(Exception ex) 
    { 
     ki(ex); 
    } 

} 

@Override 
public void onBackPressed() { 
    return; 
} 



//Toaster 
    public void ki(Exception message) 
    { 


    Toast myToast = Toast.makeText(getApplicationContext(), message.toString(), 1); 
    myToast.show(); 

} 

Works verry tốt trên Android 2,3-3,1 nhưng tôi không thể tìm ra whats vấn đề với 4.0 +

Xin giúp cảm ơn bạn!

Chỉnh sửa:

Nếu tôi xóa chủ đề của mình, mọi thứ hoạt động tốt. Vì vậy, tôi câu hỏi mới là ... Whats mới với chủ đề trong 4,0? Tôi chỉ chạy một chủ đề mà không có gì và thậm chí tôi đã có vụ tai nạn.

+1

Nhìn vào LogCat! –

+1

Sẽ rất hữu ích nếu bạn có thể chia sẻ LogCat – Naved

+0

http://tinyurl.com/7tyuqbw – weakwire

Trả lời

5

Tôi gặp sự cố tương tự khi sử dụng stop() trên Android 4.0. Hãy thử sử dụng finish() để thay thế, giải quyết được sự cố của tôi.

+0

Cảm ơn người đàn ông bạn đã làm cho ngày của tôi. –

+1

Câu trả lời này sai. finish() đóng Activity nó không dừng Thread. Trong trường hợp này, Thread sẽ tự động thoát nhưng trong tất cả các trường hợp khác, Thread sẽ tiếp tục thực hiện ngay cả sau khi Activity bị chết. – Graeme

3

Tôi đoán rằng stop() không còn hoạt động trên ICS nữa.

My tutorial at droidnova.com không được cập nhật để hoạt động trên ICS, xin lỗi, không có thời gian cho việc đó. Hôm nay tôi sẽ sử dụng một handler thay vì thread riêng biệt. Dễ sử dụng hơn và mạnh mẽ hơn.

8

Thread.stop(), resume()suspend() không còn hoạt động với Android 4.0 nữa. Mã nguồn bên dưới:

/** 
* Requests the receiver Thread to stop and throw ThreadDeath. The Thread is 
* resumed if it was suspended and awakened if it was sleeping, so that it 
* can proceed to throw ThreadDeath. 
* 
* @deprecated because stopping a thread in this manner is unsafe and can 
* leave your application and the VM in an unpredictable state. 
*/ 
@Deprecated 
public final void stop() { 
    stop(new ThreadDeath()); 
} 

/** 
* Throws {@code UnsupportedOperationException}. 
* 
* @throws NullPointerException if <code>throwable()</code> is 
*   <code>null</code> 
* @deprecated because stopping a thread in this manner is unsafe and can 
* leave your application and the VM in an unpredictable state. 
*/ 
@Deprecated 
public final synchronized void stop(Throwable throwable) { 
    throw new UnsupportedOperationException(); 
} 

Rất nhiều ứng dụng gặp sự cố trên Android 4.0 vì lý do này. Đây không phải lỗi của Google; từ nhiều năm trước, Java SDK đã không khuyến khích sử dụng stop() trên một chuỗi.

Trích từ changelog:

Commit: a7ef55258ac71153487357b861c7639d627df82f [a7ef552] 
Author: Elliott Hughes <[email protected]> 
Date: 2011-02-23 6:47:35 GMT+08:00 

Simplify internal libcore logging. 

Expose LOGE and friends for use from Java. This is handy because it lets me use 
printf debugging even when I've broken String or CharsetEncoder or something 
equally critical. It also lets us remove internal use of java.util.logging, 
which is slow and ugly. 

I've also changed Thread.suspend/resume/stop to actually throw 
UnsupportedOperationException rather than just logging one and otherwise 
doing nothing. 

Bug: 3477960 
Change-Id: I0c3f804b1a978bf9911cb4a9bfd90b2466f8798f 
7

Như @Yuku nói, Thread.stop() không bằng cách nào đó bị phá vỡ trong ICS nó đặc biệt thay đổi để ném một ngoại lệ vì nó là không an toàn:

http://developer.android.com/reference/java/lang/Thread.html#stop()

điểm dừng đồng bộ hóa công khai cuối cùng (Có thể ném được)

Vì: API Level 1 Phương pháp này không được chấp nhận. vì việc dừng một chuỗi theo cách này là không an toàn và có thể rời khỏi ứng dụng của bạn và máy ảo ở trạng thái không thể đoán trước.

Throws UnsupportedOperationException. Ném NullPointerException nếu Throwable() là null

Nếu bạn muốn, bạn đang thread để được mạnh mẽ dừng lại thay vì sử dụng threadName.interrupt() trong khi bên ngoài vào chủ đề của bạn. Chương trình trong một kết thúc natual bạn là chủ đề vòng đời để nó dừng lại tự nhiên khi nhiệm vụ của nó là hoàn thành.

Trong ví dụ của bạn, bạn chỉ cần xóa lệnh stop() vì luồng sẽ tự động ngừng thực hiện ở cuối phương thức run() của nó.

EDITfinish() là cuộc gọi đến số Activity để hoàn tất, chứ không phải số Thread của bạn. Trong ví dụ trên, Thread sẽ tự động thoát ra ngoài nhưng đừng nhầm lẫn với việc dừng một số Thread và hoàn thành một số Activity vì chúng là những thứ rất khác nhau.