2011-01-07 2 views
5

AppWidget을 디버그 하려는데 문제가 발생했습니다. D 중단 점을 설정하지 않으면 위젯이 ANR없이 작동하고 Log.v 명령이 완벽하게 실행됩니다. 하지만, 예상 프로세스는 다이로위젯 디버깅 원인 ANR

public void onReceive(Context context, Intent intent) { 
    Log.v(TAG, "onReceive 1"); // BP on this line 
    super.onReceive(context, intent); 
    String action = intent.getAction(); 

    // Checks on action and computations ... 

    Log.v(TAG, "onReceive 2"); 
    updateWidget(context); 
    Log.v(TAG, "onReceive 3"); 
} 

브레이크 포인트는 실행을 중지하는 그러면 I의 방법의 위에 배치 브레이크. 문제는 중단 점 (xD로 추측)이 ANR을 유발하고 ActivityManager가 프로세스를 종료한다는 것입니다. 로그입니다 :

01-07 14:32:38.886: ERROR/ActivityManager(72): ANR in com.salvo.wifiwidget 
01-07 14:32:38.886: INFO/Process(72): Sending signal. PID: 475 SIG: 9 
...... 
...... 
01-07 14:32:38.906: INFO/ActivityManager(72): Process com.salvo.wifiwidget (pid 475) has died. 

이로 인해 디버그가 중지됩니다. 그래서 문제는 ANR에서 발생시키지 않고 위젯을 디버깅하는 방법이 있습니까 ?? 미리 답변 해 주셔서 감사합니다.

+0

이봐, 혹시 이것에 대한 해결책을 찾았습니까? – span

답변

2

맞습니다. this에 따르면 onReceive 메소드를 처리하는 데 10 초 이상이 걸리면 위젯의 BroadcastReceiver가 시스템에 의해 종료됩니다. 다음 위젯에 통합, 프리젠 테이션 및 디버깅 작업의 논리에서

  1. 별도의 논리 : 내 머리의 상단에서

    나는 두 가지 솔루션을 볼 수 있습니다.

  2. "오래된 좋은"로깅을위한 리조트.

또는 다음 중 시도해 볼 수 있습니다. 나는 그것이 어떻게 작동 할지는 모르지만 어쩌면이 접근법을 시도해 볼만한 가치가있을 것입니다.

자신의 활동을 위젯의 RemoteViews에 대한 호스트로 사용하십시오. 나는이 같은 짓을 한 : ID = widget_view이 레이아웃의 LinearLayout에서

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <LinearLayout 
      android:id="@+id/widget_view" 
      android:layout_width="fill_parent" 
      android:layout_height="200dp"/> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Inflate widget" 
     android:onClick="onInflateClick"/> 
    <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Update widget" 
      android:onClick="onUpdateClick"/> 
</LinearLayout> 

위젯 호스트를 재생됩니다. 활동 코드 자체는 다음과 같습니다

package com.example; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.RemoteViews; 

public class MyActivity extends Activity { 
    private LinearLayout widgetHolder; 
    private View widgetView; 

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

     widgetHolder = (LinearLayout) findViewById(R.id.widget_view); 
    } 

    public void onInflateClick(View v) { 
     RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget); 
     views.setImageViewResource(R.id.image, R.drawable.img1); 
     views.setTextViewText(R.id.text, "Widget created"); 
     widgetView = views.apply(this, null); 
     widgetHolder.addView(widgetView); 
    } 

    public void onUpdateClick(View v) { 
     onUpdateWidget(0); 
    } 

    public void onUpdateWidget(int widgetId) { 
     RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget); 
     views.setImageViewResource(R.id.image, R.drawable.img2); 
     views.setTextViewText(R.id.text, "Widget updated"); 

     // Tell the AppWidgetManager to perform an update on the current app widget 
     updateWidget(widgetId, views); 
    } 

    private void updateWidget(int widgetId, RemoteViews views) { 
     views.reapply(this, widgetView); 
     // appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
} 

updateWidget 방법으로 위젯 업데이트 논리를 넣어 (또는 가짜 매개 변수를 사용하여 위젯의 브로드 캐스트 리시버의 적절한의 onUpdate 메소드를 호출) 그리고 당신이 버튼 클릭으로 디버깅 할 수 있습니다 활동.

다시 한번 말하지만, 나는 실제 위젯에서이 코드를 사용하지 않았으며, 아이디어를 내고 코드를 작성하려고했습니다. 자신의 위험에 그것을 사용하십시오 :)

당신이 그것을 시도하려는 경우에 대비하여내 신속하고 더러운 프로젝트를 넣어. 그것은 Idea 프로젝트이지만 Eclipse로 가져 오기는 쉽습니다.