4

문제가있는 Android 앱이 있습니다.Android - 진행 표시가 AsyncTask에 표시되지 않음

기본적으로 ProgressDialog은 전혀 표시되지 않습니다. 나는 이것이 어떤 일종의 스레딩 문제라고 생각하지만 그것을 고치는 방법을 모른다.

나는 ActionBarSherlock과 일부 Fragments을 사용하고 있습니다. 나는 또한 새로운 안드로이드 DrawerLayout을 사용하고 있는데, 클릭 할 때 조각을 대체하는 서랍에 내 옵션이 있습니다.

내 앱이 처음로드되면 데이터베이스를 검사하여 처음 데이터가 다운로드되었는지 확인하려고합니다. 그렇지 않은 경우 데이터를 다운로드하려면 AsyncTask을 시작하십시오. 이 동안에는 ProgressDialog 디스플레이가 있어야하지만 그렇지 않습니다.

누군가 내가 잘못 가고있는 것을 볼 수 있습니까? 감사.

MainScreen - 응용 프로그램이

public class MainScreen extends SherlockFragment { 
    public static final String TAG = "MainScreen"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.activity_main, container, false); 
     setHasOptionsMenu(false); 

     ImageView imgLogo = (ImageView) rootView.findViewById(R.id.imgMainScreen); 
     imgLogo.setOnClickListener(new ButtonHandler(getActivity())); 

     checkDatabase(); 
     return rootView; 
    } 

    private void checkDatabase() { 
     //Ensure there is data in the database 
     DBHelper db = new DBHelper(this.getSherlockActivity()); 
     db.checkDatabase(); 
    } 
... 
} 

DBHelper.checkDatabase을 (열립니다 기본 방문 페이지/조각) - 다운로드에게 마지막으로

public void checkDatabase() { 
    if (isEmpty()) { 
     //Connect to net and download data 
     NetworkManager nm = new NetworkManager(activity); 
     if (!nm.downloadData()) { 
      Toast.makeText(activity, R.string.internetCheck, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

과를 시작하는 방법 NetworkManager.downloadData() -에서 시작하는 메서드210 : 응용 프로그램이로드하려고 시도하고, 때로는 ANR로 위의 코드를 사용하여

public boolean downloadData() { 
     try { 
      return new HttpConnection(activity).execute().get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 

    public class HttpConnection extends AsyncTask<Void, Void, Boolean> { 
     private ProgressDialog progressDialog; 
     private Activity m_activity; 

     protected HttpConnection(Activity activity) { 
      m_activity = activity; 
     } 

     @Override 
     protected void onPreExecute() { 
      progressDialog = new ProgressDialog(m_activity); 
      progressDialog.setMessage("Wait ..."); 
      progressDialog.setCancelable(false); 
      progressDialog.setMax(100); 
      progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      progressDialog.show(); 

      super.onPreExecute(); 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      String[] types = new String[]{"type1", "type2", "type3", "type4", }; 
      StringBuilder sb = new StringBuilder(); 

      for(String type : types) { 
       sb = new StringBuilder(); 
       if(DBHelper.TYPE4_TABLE.equals(type)) { 
        InputStream is = activity.getResources().openRawResource(R.raw.dbdata); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
        try { 
         sb.append(reader.readLine()); 
        } catch (IOException e) { 
         Toast.makeText(activity.getApplicationContext(), "Error retriveving data", Toast.LENGTH_SHORT).show(); 
         Log.e(Constants.TAG, "Error reading data"); 
         e.printStackTrace(); 
        } 
       } else { 
        sb = fetchURLData(Constants.ALL_URL+type); 
       } 
       cleanDataAndStore(sb, type); 
      } 

      return true; 
     } 

     @Override 
     protected void onPostExecute(Boolean result){ 
       progressDialog.hide(); 
     } 
    } 

, 내가 얻을 모두 흰색 화면입니다. 다운로드가 완료되면 조각이로드됩니다. 따라서 누락 된 ProgressDialog을 제외하고는 정상적으로 작동합니다.

PS 알림 각 생성자에 activity을 설정하고 있습니다.

감사합니다.

답변

10

.get()return new HttpConnection(activity).execute().get();에서 제거하십시오. 기본적으로 UI 스레드를 잠그고 있습니다. 일단 제거되면 AsyncTasks가 작동 할 것으로 예상되므로 작동해야합니다.

비동기이므로 boolean downloadData()의 반환 유형은 void이어야합니다. 데이터로 무언가를 할 필요가 있다면 "청취자"인터페이스를 구현하고 AsyncTask에 전달해야합니다.

예 리스너 :

class TaskConnect extends AsyncTask<Void, Void, ConnectionResponse> { 

    private final AsyncTaskListener mListener; 

    /** 
    * 
    */ 
    public TaskConnect(AsyncTaskListener listener) { 
     ... 
     mListener = listener; 
    } 

    @Override 
    protected void onPreExecute() { 
     if (mListener != null) { 
      mListener.onPreExecute(mId); 
     } 
    } 

    @Override 
    protected ConnectionResponse doInBackground(Void... cData) { 
     ... 
     return responseData; 
    } 

    @Override 
    protected void onPostExecute(ConnectionResponse response) { 
     if (mListener != null) { 
      mListener.onComplete(response); 
     } else { 
      LOG.w("No AsyncTaskListener!", new Throwable()); 
     } 
    } 
} 

public interface AsyncTaskListener { 
    public abstract void onPreExecute(int id); 
    public abstract void onComplete(ConnectionResponse response); 
} 
+0

안녕하세요. 감사합니다.대단히 감사합니다! 나는 빚지고있어! – eoinzy

+0

제 경우에도 get()이 문제였습니다. 정보 주셔서 감사합니다!!! –

+0

@ J.Romero 정말 도움이되는 +1 – rup35h

0

내 문제는() 메소드 후 실행() 메소드 GET 호출 된 다른 사람의 일반적인 문제가 아니었다. 내 문제는 내 AsyncTask 메서드에 전달하는 컨텍스트입니다. settingsActivity가 있고 asynctask 작업을 호출하는 ReadMeActivity가 있습니다. 호출되는 컨텍스트 (ReadMeActivity.this)를 사용하는 대신 settingsActivity를 사용하여이를 볼 수 없게했습니다. 일단 내가 그것을 바꿔서 그것을 통과 시켰을 때, 그 활동이 호출 된 상황이 효과를 발휘했다.

다른 사람에게 도움이되기를 바랍니다.

관련 문제