2013-08-26 2 views
0

내 안드로이드 앱에 문제가 있습니다. 너무 많이 검색했지만 문제를 해결할 단서를 찾을 수 없습니다. 이것은 내 문제입니다Android AsyncTask 및 진행률 막대

나는 각 목록 항목에 onclick을 사용하여 목록 항목의 진행률 막대를 업데이트하는 새로운 AsyncTask를 시작합니다. 시스템이 어떤 이유로 내 활동을 파괴 할 때

문제는

중 하나가 나를 도울 수 있으며, AsyncTasks 작동을 유지하지만 새로 만든 진행률 표시 줄에 영향을주지 않습니다 온다? 미리 감사드립니다.

+0

작업 완료시 AsyncTasks를 삭제 하시겠습니까? – AAnkit

+0

아니요, 계속 작업해야하고 활동이 다시 작성된 후에도 새 진행 막대 –

+0

을 업데이트 할 수 없습니다. 서비스가 더 잘 사용됩니다. 활동이 최전방에 있지 않아도 계속 작업하려면 계속 사용하십시오. – AAnkit

답변

1
내가리스트 뷰에 대한 데이터가 저장되고 그 클래스에 내가

INT 진행라는 변수를 생성하는 직렬화 클래스를 가졌다 내가 무슨 짓을하다 그 같은 문제가 앓고

;

아무것도 내가 때문에 직렬화 클래스의 각 행에 대한 고유하고 object.Here은 예입니다이 변수에 대한 업데이트를 설정 asynsTask에서 업데이트됩니다 : -

Content.java

public class Content implements Serializable { 

      @SerializedName("id") 
      protected String id; 

      protected int progress = -1; 

      public String getId() { 
        return id; 
      } 

      public String setId(String id) { 
        this.id = id; 
      } 

      public int getProgress() { 
        return progress; 
      } 

      public void setProgress(int progress) { 
        this.progress = progress; 
      } 
    } 

MainActivity.java - :

AsyncAdapter - :

public class AsyncAdapter extends ArrayAdapter<Content> { 

    Context context; 
    ArrayList<Content> items; 
    private static final int TYPE_MAX_COUNT = 1; 

    public AsyncAdapter(Context context, int resource, 
      int textViewResourceId, ArrayList<Content> items) { 
     super(context, resource, textViewResourceId, items); 
     this.context = context; 
     this.items = items; 
    } 

    public int getViewTypeCount() { 
     return TYPE_MAX_COUNT; 
    } 

    @Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 

       // Layout inflate code 

       // if else condition to visible progress bar 
       viewHolder.progressbar.setProgress(content.getProgress(position)); 

       viewHolder.downloadButton 
         .setOnClickListener(new OnClickListener() { 

          @Override 
          public void onClick(View arg0) { 
       //Start service here 
       Intent serviceIntent = new Intent(MainActivity.this,DownloadService.class); 
       serviceIntent.putExtra("id",id); 
       startService(serviceIntent); 

      }}); 
    } 
} 

BroadCastReceiver에서 진행률을 설정하고 진행률 표시 줄의 진행률을 업데이트 할 수 있습니다.

public class DownloadReceiver extends BroadcastReceiver { 


@Override 
public void onReceive(Context context, final Intent intent) { 

    final int progress = intent.getIntExtra("progress", 0); 
    final String broadcastId = intent.getStringExtra("id"); 

    for(int i=0;i<contents.size();i++) { 
     if(contents.getId().equals(broadcastId)) { 
      contents.get(i).setProgress(progress); 
     } 
    } 

    adapter.notifyDataSetChanged(); // to update progressbar and listview 
    removeStickyBroadcast(intent); 
} 

그리고 서비스에서 당신은 수신기에 진행을 보낼 수 있으며이 대신 asynTask.To 당신이 중 하나가 그것을 해석하는 내용의 데이터를 추가하고 GSON를 사용하여 추가 사용의 더 나은 선택이라고 생각 simultaneously.I 업데이트 할 수 있습니다 명시 적으로 추가하십시오.이 방법이 도움이되기를 바랍니다. 그러면 listview 내에서 진행 막대를 처리하는 방법을 더 잘 이해할 수 있습니다.

+0

이 솔루션에 대한 예제를 공유 할 수 있습니까? –

+0

@OmarHassan 나는 나의 대답을 편집했다. –

+0

답장을 보내 주셔서 감사합니다. 작동하지만 다른 방법으로 사용하고 있습니다. –

0

콜백 수신기 메서드를 하나 만들고 활동에서 재정의하십시오.이 콜백 메서드를 AsynkTask의 onProgressUpdate에서 호출하고 진행률 막대를 업데이트하십시오.

+0

진행률 막대는 목록 어댑터 데이터 모델에 의해 유지됩니다. –

+0

하지만 각 진행률 막대는 어댑터 – kirankk

+0

에서 액세스 할 수 있습니다. 예 : –

0

나는이 Post이 당신을 도울 수 있다고 생각합니다. 그러나 이것은 특히 구성 변경으로 인해 활동이 재 작성되는 경우에 해당됩니다.