2015-10-07 89 views
0

我的Android应用程序有一个AsyncTask从我的服务器获取数据。当我从数据库中拉出几行时,它的速度非常快,我不需要在获取新数据时加载动画。如何在AsyncTask中显示ProgressDialog?

当我拉从数据库2,3k行,可能会慢下来,所以我决定用一些指标(加载动画),这样,用户就知道数据在后台收集。我得到了一个活动Fill_in_phone,我拨打asyncTask,名称为GetOcitanja

我对AsynTask代码:

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.HTTP; 
import org.apache.http.util.EntityUtils; 
import java.io.IOException; 

public class GetOcitanja extends AsyncTask<Object, Void, String> { 

Activity _context; 
String _str_mesg; 
String _str_naslov; 
public ProgressDialog progress; 
public GetOcitanja(Activity context, String str_naslov, String str_message){ 
    this._context = context; 
    this._str_naslov = str_naslov; 
    this._str_mesg = str_message; 
} 

@Override 
protected void onPreExecute() { 
    //super.onPreExecute(); 
    progress = ProgressDialog.show(_context, _str_naslov, 
      _str_mesg, true); 
    progress.show(); 

} 

@Override 
protected void onPostExecute(String s) { 
    //super.onPostExecute(s); 
    progress.dismiss(); 
} 

@Override 
protected String doInBackground(Object... params) { 

    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    HttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpRequest = new HttpGet(Config.url_get_ocitanja_async_taks); 
    String odg=""; 


    try { 
     HttpResponse response = httpClient.execute(httpRequest); 
     HttpEntity entity = response.getEntity(); 
     odg = EntityUtils.toString(entity, HTTP.UTF_8); 

    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    return odg; 
} 

正如你所看到的,我把2秒睡眠时间来模拟一个大的数据集。我把这种AsyncTask在我Fill_in_Data活动:

GetOcitanja asyncTask=new GetOcitanja(Fill_in_phone.this, "a","b"); 
asyncTask.execute(); 
String response=""; 
try { 
     response= asyncTask.get(); 
    } catch (InterruptedException e1) { 

     e1.printStackTrace(); 
    } catch (ExecutionException e1) { 
     e1.printStackTrace(); 
    } 
} 

我跟着几个解决方案,从SO和没有任何帮助。我做错了什么?

+0

http://stackoverflow.com/a/9814882/5202007 – Tauqir

+0

遵循这些例子,没有任何帮助。我应该用线程替换AsyncTask吗? – KuKeC

+0

'我在这里调用asyncTask GetOcitanja'。请完整显示你是如何做到的。 – greenapps

回答

1
response= asyncTask.get(); 

删除。

您已经有一个asyncTask.execute()。

处理onPostExecute()中的响应。

我问你之前,你怎么叫你的异步任务,我认为你使用获得()。你打电话给它两次,现在只显示。

+0

所以'asyncTask.get();'和'asyncTask.execute();'做同样的工作? – KuKeC

+0

谢谢,现在它工作:) – KuKeC

1

将您ProgressDialogonPreExecute,下面的示例代码:

private ProgressDialog pdia; 

@Override 
protected void onPreExecute(){ 
    super.onPreExecute(); 
     pdia = new ProgressDialog(yourContext); 
     pdia.setMessage("Loading..."); 
     pdia.show();  
} 

@Override 
protected void onPostExecute(String result){ 
    super.onPostExecute(result); 
     pdia.dismiss(); 
} 

https://stackoverflow.com/a/25998219/5202007

1
public GetOcitanja(Activity context, String str_naslov, String str_message){ 
    this._context = context; 
    this._str_naslov = str_naslov; 
    this._str_mesg = str_message; 
    progressDialog = new ProgressDialog(_context); 
    progressDialog.setTitle("Progress"); 

} 

可以尝试创建内部构造进度对话框

+0

这是我的第一个版本的代码,如果你看看版本。我有建议,我应该把它放在onPreExecute。 – KuKeC

+0

你有看到logcat上的任何东西吗? – Tixeon

+0

你放的部分** response = asyncTask.get()**得到概率我猜 – Tixeon