2014-12-07 2 views
0

내 앱에서 내 앱 사용자가 앱을 쉽게 업그레이드 할 수 있도록 자동 업그레이드 기능을 구현하고 싶습니다. 그렇게하기 위해 syncAdapter (원격 mySQL 서버에서 로컬 SQLite를 업데이트하는 데 이미 사용할 수 있음)를 사용하기로 결정했습니다. 그래서 내 syncAdapter에서 나는 다음과 같이 응용 프로그램 업그레이드를 수행 내 AsyncTask를 클래스에 대한 호출을 만드는 중이라서 :AsyncTask dialogBuilder 오류

public SyncAdapter(Context context, boolean autoInitialize) { 
    super(context, autoInitialize); 
    this.context = mContext; 
} 

@Override 
    public void onPerformSync(Account account, Bundle extras, String authority,ContentProviderClient provider, SyncResult syncResult) { 
Context mcontext = mContext; 
new AsyncGetVersiune(mcontext).execute("3", "1"); 
... 
} 

그럼 내 AsyncGetVersiune 클래스는이 (업그레이드가 필요한 경우)을 수행합니다

public class AsyncGetVersiune extends AsyncTask<String, Integer, Double> { 
    private Context mContext; 

    public AsyncGetVersiune (Context context){ 
    super(); 
    mContext = context; 
    } 

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 
mContext.registerReceiver(downloadReceiver, filter); 
final String calex = calea; 

AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
builder.setMessage("There is a newer version available. Upgrade now?") 
.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    //if the user agrees to upgrade 
    public void onClick(DialogInterface dialog, int id) { 
     //start downloading the file using the download manager 
     downloadManager = (DownloadManager) mContext.getSystemService(mContext.DOWNLOAD_SERVICE); 
     Uri Download_Uri = Uri.parse(calex); 
     DownloadManager.Request request = new DownloadManager.Request(Download_Uri); 
     request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); 
     request.setAllowedOverRoaming(false); 
     request.setTitle("Download new version"); 
     request.setDestinationInExternalFilesDir(mContext, Environment.DIRECTORY_DOWNLOADS, "Newversion.apk"); 
     downloadReference = downloadManager.enqueue(request); 
     } 
    }) 
.setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
    } 
}); 
builder.create().show(); 

그러나 DialogBuilder와 관련하여 오류가 발생합니다. 분명히 내 컨텍스트를 좋아하지 않습니다 ...

*"Error parsing data android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application"* 

어떻게해야합니까? Dialog inplace를 가지고 싶습니다 ... 그래서 syncAdapter는 AsyncTask 클래스를 사용하여 새 버전을 확인합니다. AsyncTask가 새 버전을 찾으면 onPostExecute에서 대화 상자를 표시하고 거기에서 ... 새 버전의 다운로드 및 설치를 시작합니다.

그러나 syncAdapter에서 업그레이드 프로세스를 시작한 이래로 ... 여기에 얽힌 활동을 ...

그럼 어떻게해야합니까?

답변

0

UI 메서드에서만 AlertDialog를 호출해야합니다. onPostExecute()

+0

AlertDialog를 포기하고 다운로드를 시작하더라도 .... "request.setDestinationInExternalFilesDir (mContext, Environment.DIRECTORY_DOWNLOADS,"Newversion.apk ");"을 호출해야합니다. 내 컨텍스트를 사용합니다. 따라서 AlertDialog 없이도이 오류가 계속 발생합니다. – user1137313

+0

그래서 해결책은 무엇입니까? 이 접근 방식을 사용하지 않습니까? 거기에있는 모든 앱이 어떻게 작동 할 수 있습니까? – user1137313

+0

필요를 더 명확하게 설명하십시오 - 먼저 AlertDialog를 시작하고 AsyncTask를 시작한 후에? 혹은 그 반대로도? 첫 번째 상황에서는 AlyncDialog를 AsyncTask에 배치하면 안됩니다. 이것은 당신의 실수 인 것 같습니다. 대화 상자를 열어 결과를 처리하고 필요한 경우 AsyncTask를 평소와 같이 시작해야합니다. –

0

컨텍스트가 더 이상 유효하지 않은 경우 BadTokenException이 발생합니다. 당신이 SyncAdapter가 인스턴스화되는 경우의 코드를 붙여 넣을 수 있습니다 getApplicationContext() 대신 getContext()의 또는 mActivity.this

을 전달하십시오.

0

잘못된 컨텍스트 변수를 전달하기 만하면됩니다. 그래서

new AsyncGetVersiune(context).execute("3", "1"); 

코멘트 어댑터 클래스에 다시의 인스턴스를 생성이 줄

Context mcontext = mContext; 

new AsyncGetVersiune(mcontext).execute("3", "1"); 

에서 여기 변경해야합니다.