2011-08-31 4 views
0

AsyncTask로 시작된 백그라운드 스레드에서 루트 액세스를 요청합니다. 거부 된 경우 (su not found) 사용자에게 알려 드리고자합니다. 백그라운드 스레드에서 직접 UI 스레드에 게시 할 수는 없지만 주 활동에 대한 참조를 통해 테스트했을 때 제대로 작동하는 것처럼 보였습니다. 지금은 시장에 게시 있다고하지만, 이러한 오류가보고됩니다 여기 스레드에서 안드로이드 대화

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:266) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574) 
at java.lang.Thread.run(Thread.java:1020) 
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not  called Looper.prepare() 
at android.os.Handler.<init>(Handler.java:121) 
at android.app.Dialog.<init>(Dialog.java:100) 
at android.app.AlertDialog.<init>(AlertDialog.java:96) 
at android.app.AlertDialog$Builder.create(AlertDialog.java:891) 
at com.sajarvis.albert.AlbertActivity.onCreateDialog(AlbertActivity.java:357) 
at android.app.Activity.onCreateDialog(Activity.java:2747) 
at android.app.Activity.createDialog(Activity.java:948) 
at android.app.Activity.showDialog(Activity.java:2825) 
at android.app.Activity.showDialog(Activity.java:2789) 
at com.sajarvis.albert.AlbertActivity$HiyaTask.doInBackground(AlbertActivity.java:507) 
at com.sajarvis.albert.AlbertActivity$HiyaTask.doInBackground(AlbertActivity.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:252) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
... 4 more 

대화 창조자의 코드입니다 (선 349-360) 백그라운드에서

case 1: //su denied 
    Log.w(TAG,"Su denied failure"); 
    builder 
     .setTitle(R.string.su_denied_title) 
     .setMessage(R.string.su_denied_message) 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
    }).create(); 
break; 

그리고 라인 501-511 스레드, 여기서 나는 대화 상자를 실패라고 부른다.

//Get ROOT access. 
try { 
    process = Runtime.getRuntime().exec("su"); 
} catch (IOException e1) { 
    //TODO crashes here 
    activity.showDialog(1); 
    FlurryAgent.onError("4","su denied","Fail"); 

    return success; //False, fail. 
} 

activity.showDialog (1); 무슨 일이 일어난거야? 그렇다면 일관되게 충돌하지 않는 이유는 무엇입니까? 그렇지 않다면 어떤 아이디어일까요? 감사합니다.

+0

AsyncTask를 쓰고있는 스레드는 무엇입니까? AsyncTask의 Where가 AlertDialog 생성이 시작 되었습니까? –

+0

주 활동 인 UI 스레드에서 작업을 만듭니다. 대화 상자에 대한 AsyncTask의 유일한 행은 activity.showDialog (1)입니다. UI 스레드에서 onCreateDialog()를 호출합니다. – jarvisteve

답변

1

코드는 여전히 백그라운드 스레드의 대화 상자를 표시하려고 시도합니다.

당신이 원하는 것은 doInBackground()에서 결과를 반환하고 결과에 su을 찾을 수 없다면 onPostExecute()에 대화 상자를 표시하는 것입니다.

+0

감사합니다. 몇 가지 사항을 변경하겠습니다. 불일치의 원인이 있습니까? 그것은 unrooted HTC 인크레더블, 에뮬레이터 및 unrooted 태블릿에서 작동합니다. – jarvisteve

관련 문제