0

이 AsyncTask 내부 클래스를 만들었으니 이제는 외부 클래스로 만들고 싶습니다. 코드는 다음과 같습니다.내부 AsyncTask를 바깥 쪽 AsyncTask로 변환하는 방법?

private class DownloadDataFromServer extends AsyncTask<String, Integer, String> { 
     ProgressDialog dialog; 
     boolean connErr = false; 
     boolean soErr = false; 

     @Override 
     protected void onPreExecute() { 
      dialog = new ProgressDialog(HomePage.this); !!!!PROBLEM!!!! 
      dialog.setIndeterminate(false); 
      dialog.setMax(100); 
      dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      dialog.setCancelable(false); 
      dialog.setTitle("Download"); 
      dialog.setMessage("Updating..."); 
      dialog.show(); 

      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground(String... urls) { 
      // do something 
     } 

     protected void onProgressUpdate(Integer... progress) { 
      // Update the progress 
      dialog.setProgress(progress[0]); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      if (connErr || soErr) { 
       String msg = "Bad connection"; 
       AlertDialog.Builder builder; 
       builder = new AlertDialog.Builder(HomePage.this); !!!!PROBLEM!!!! 
       builder.setCancelable(false); 
       builder.setTitle("Connection timeout"); 
       builder.setMessage(msg); 

       builder.setPositiveButton("Retry", new DialogInterface.OnClickListener(){ 
        @Override 
        public void onClick(DialogInterface dialog, int which) 
        { 
         dialog.dismiss(); 
         new DownloadDataFromServer().execute(new String[] { "http://www.example.com" }); 
        } 
       }); 

       builder.setNegativeButton("Exit", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
         finish(); !!!!PROBLEM!!!! 
        } 
       });   
       AlertDialog dialog = builder.create(); 
       dialog.show(); 
      } else { 
       if (Integer.parseInt(result) <= 0) { 
        Toast.makeText(getBaseContext(), "Error!", Toast.LENGTH_SHORT).show(); !!!!PROBLEM!!!! 
       } else { 
        Toast.makeText(getBaseContext(), "OK!", Toast.LENGTH_SHORT).show(); !!!!PROBLEM!!!! 
       } 
      } 
      dialog.dismiss(); 
     } 
    } 

"!!!! 문제! 위 코드의 문자열 : 내가 얻은 모든 오류가 있습니다. 몇 가지 해결 방법을 적용하려고했지만 마침내 제대로 작동하지 않게 만들었습니다. 또한 나는 사용해야 만한다

private Database db = new Database(this); 

그러나 나는 "this"대신에 무엇을 넣을 지 모른다. 이 내부 클래스를 올바른 방식으로 변환하도록 도와주세요.

+0

내부 클래스에서 '이것'이 무엇인지 생각한 다음 변경 방법을 알 수 있습니다. –

+0

또한 위에 게시 된 코드의 첫 번째 줄에서이 오류가 발생합니다. 클래스 DownloadDataFromServer에 대한 잘못된 수정 자; 공개, 초록 및 최종 만 허용됩니다. 무슨 일이야? – smartmouse

답변

5

당신은 하나 개의 인수 constructorDownloadDataFromServer에 클래스를 확인하고 통과 상황를 인수로

Context mCon; 

public DownloadDataFromServer(Context con){ 
this.mCon=con; 
} 

처럼 그렇게

 builder = new AlertDialog.Builder(mCon); 

마지막에서처럼 DownloadDataFromServer의 아무 곳이 mCon 컨텍스트를 사용한다 DownloadDataFromServerActivity에서

와 같이
new DownloadDataFromServer(your_Activity.this).execute(......); 
+0

내가 해냈다.하지만 Toast에서 getBaseContext() 메소드를 사용하면 어떨까? 그런 다음 builder.setPositiveButton 아래에서 새 DownloadDataFromServer(). execute 호출을 처리하는 방법? – smartmouse

2

DownloadDataFromServerHomeScreen를 받아들이는 생성자가 행해져 Yout 확인, 생성자에서 필드에 홈 화면을 저장하고 대신 HomeScreen.this의 모든 곳에서 해당 필드를 사용합니다.

HomeScreen의 비공개 필드를 일부 공개 (또는 접근 자 제공)해야 할 수도 있습니다.

모든 것을하고 싶지는 않지만 이점은 무엇입니까?

+0

그냥 "이"문제가 아니라, 예를 들어 getBaseContext()를 대체해야합니다 ... – smartmouse

+0

HomeScreen.this.getbaseContext()를 사용할 수 있습니다. HomeScreen을 필드에 저장 했으므로 mHomeScreen이라고하면 mHomeScreen.getBaseContext()를 호출 할 수 있습니다. –

+0

HomeScreen에서만 작동했습니다. – smartmouse