在我的应用程序中,我需要显示一个循环的ProgressBar,直到3个AsynchTasks完成。
我无法达到结果。
请提供任何帮助。
public class MainActivity extends Activity {
public ArrayList<String> files=new ArrayList<String>();
public String mQuery=null;
public File root=Environment.getRootDirectory();
public ArrayAdapter<String> ad;
public ArrayList<String> queries= new ArrayList<String>(Arrays.asList(".prc",".mobi",".epub"));
public ProgressBar pb;
public ListView lv;
public LinearLayout ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll=(LinearLayout)findViewById(R.id.layout);
pb =(ProgressBar)findViewById(R.id.progress);
lv=(ListView)findViewById(R.id.listView1);
}
protected void onResume(){
super.onResume();
ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
lv.setAdapter(ad);
for(int i=0;i<queries.size();i++){
AddStringTask as= new AddStringTask();
try {
mQuery=queries.get(i);
as.execute(Environment.getRootDirectory());
} catch (Exception e) {
e.printStackTrace();
}
}
//pb.setVisibility(View.GONE);
lv.setVisibility(View.VISIBLE);
for(int i1=0;i1<files.size();i1++){
ad.add(files.get(i1));
}
ad.notifyDataSetChanged();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String path =(String) lv.getItemAtPosition(position);
if((!path.endsWith(".prc"))) {
Intent vi=new Intent();
vi.setAction(Intent.ACTION_VIEW);
vi.setData(Uri.parse("file://" +path));
vi.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(vi);
}
if((path.endsWith(".prc"))) {
String bookID=path.substring(path.length()-19, path.length()-9);
Intent vi=new Intent();
vi.setAction(Intent.ACTION_VIEW);
Uri file = Uri.parse("kindle://book/?action=open&book_id=AMZNID0/" + bookID + "/0/");
vi.setData(file);
vi.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(vi);
}
}
});
}
class AddStringTask extends AsyncTask<File, Void, Void> {
@Override
protected void onPreExecute(){
pb.setVisibility(View.VISIBLE);
//lv.setVisibility(View.INVISIBLE);
}
@Override
protected Void doInBackground(File... root) {
search(root[0]);
return (null);
}
@Override
protected void onProgressUpdate(Void... unused) {
}
@Override
protected void onPostExecute(Void unused) {
Toast.makeText(MainActivity.this, "DONE", Toast.LENGTH_LONG)
.show();
pb.setVisibility(View.GONE);
lv.setVisibility(View.VISIBLE);
ll.invalidate();
}
}
这是我的XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
答案 0 :(得分:0)
您可能有一个计数器,初始化了您要执行的任务数。当asyncTask
完成时计数器减少,并且一旦计数器= 0,progressBar
被解除。你可以检查每个asyncTask
的完成情况并在每个asyncTasks
的onPostExecute中的计数器,进度条解雇等等。
答案 1 :(得分:0)
您可以创建在post执行时调用三个AsyncTask中的每一个时调用的方法,并且此方法检查三个AsyncTask是否已完成,例如此方法:
private void methodName ()
{
if(task1 && task2 && task3)
{
//execute the code ... hide the progress bar
}
}
在帖子上执行将是这样的:
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//AsyncTask one on post execute
task1 == true;
methodName();
}
答案 2 :(得分:0)
如果我已正确理解您的问题和代码,您需要更改的内容是隐藏进度条并显示视图的方式。您的代码现在的方式将导致栏被隐藏,并且在每个AsyncTask
完成后显示列表。
您需要让代码隐藏仅调用一次的进度条和显示列表,并将其保留在最后AsyncTask
完成之后。
您可能会做的是在AsyncTask
完成时增加静态AtomicInteger
。然后,在完成每个任务时,调用一个方法来保存代码以隐藏进度条并显示列表。但是,如果提到的计数为3,则此方法仅执行此代码。
您可以通过使用接口来实现此目的,以允许任务在执行它的类中调用方法,如此answer中所述。或者您可以通过MainActivity中的静态方法来完成。
旁注: 如果您希望将此行为扩展到可以随时运行的任务,而不是使用预设值(如3),则在任务开始时再次计数增加,并在方法中检查启动的任务数是否等于完成的任务数量。
答案 3 :(得分:0)
MaintringTask ms = new MaintringTask();
ms.execute();
class MaintringTask extends AsyncTask<File, Void, Void> {
@Override
protected Void doInBackground(File... root) {
for (int i = 0; i < queries.size(); i++) {
AddStringTask as = new AddStringTask();
try {
mQuery = queries.get(i);
as.execute(Environment.getRootDirectory()).get();
} catch (Exception e) {
e.printStackTrace();
}
}
return (null);
}
@Override
protected void onProgressUpdate(Void... unused) {
}
@Override
protected void onPostExecute(Void unused) {
for (int i1 = 0; i1 < files.size(); i1++) {
ad.add(files.get(i1));
}
ad.notifyDataSetChanged();
pb.setVisibility(View.GONE);
}
class AddStringTask extends AsyncTask<File, Void, Void> {
@Override
protected Void doInBackground(File... root) {
search(root[0]);
return (null);
}
@Override
protected void onProgressUpdate(Void... unused) {
}
@Override
protected void onPostExecute(Void unused) {
Toast.makeText(MainActivity.this, "DONE", Toast.LENGTH_LONG)
.show();
}
答案 4 :(得分:0)
请尝试解除UI线程中的进度条
runOnUiThread(new Runnable() {
@Override
run(){
progressbar.setVisibility(View.Gone)
}
}