【问题标题】:How can I remove an alert dialog after a AsyncTask has done it's work如何在 AsyncTask 完成工作后删除警报对话框
【发布时间】:2011-01-25 04:31:49
【问题描述】:

我相信我这样做是正确的,在我调用的活动类中执行警报对话框出现,然后数据加载但警报对话框永远不会消失。这是我的 AsyncTask 代码:

后面是我的活动代码。

public class Worker extends AsyncTask<URL, Integer, Long>{
private Activity ne;
private ProgressDialog progressDialog;
private Handler handler;


public Worker(Handler handler, Activity ne){
this.handler = handler;
this.ne = ne;

}

protected void onPreExecute() {
    progressDialog = ProgressDialog.show(ne,"", "Retrieving News Events", true);
}

protected void onProgressUpdate(Void... progress) {

}

protected void onPostExecute(Void result) {

    progressDialog.dismiss();
}

/* (non-Javadoc)
 * @see android.os.AsyncTask#doInBackground(Params[])
 */
@Override
protected Long doInBackground(URL... urls) {
HttpClient client = new DefaultHttpClient();
HttpGet get;

    try {
            get = new HttpGet(urls[0].toURI());
        ResponseHandler<String> response = new BasicResponseHandler();
        String responseBody = client.execute(get, response);


        String page = responseBody;

        Bundle data = new Bundle();

        data.putString("page",page);
        Message msg = new Message();
        msg.setData(data);

        handler.sendMessage(msg);

    }
    catch (Throwable t) {
        Log.d("UpdateNews", "PROBLEMS");
    }
return null;
}

}

public class NewsEvents extends ListActivity{
private URL JSONNewsEvents;
private ArrayList<NewsEvent> neList;
private ArrayList<String> keyWordList;
private Worker worker;
private TextView selection;
private ProgressDialog progressDialog;
static final int PROGRESS_DIALOG = 0;
public static final String KEYWORDS = "keywords";
private NewsEvents ne;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.newsevents);
    ne = this;
    neList = new ArrayList<NewsEvent>();
selection=(TextView)findViewById(R.id.selection);

    try {
    JSONNewsEvents = new URL(getString(R.string.jsonnewsevents));
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

    worker = new Worker(handler, this);

    setListAdapter(new IconicAdapter());
    getKeywords(); 
    worker.execute(JSONNewsEvents);


}

/**
 * @return
 */

public ArrayList<String> getKeywords(){
try {
    InputStream fi = openFileInput(KEYWORDS);

    if (fi!=null) {
        ObjectInputStream in = new ObjectInputStream(fi);
                keyWordList = (ArrayList<String>) in.readObject();
                in.close();
    }
}
catch (java.io.FileNotFoundException e) {
    // that's OK, we probably haven't created it yet
}
catch (Throwable t) {
    Toast
        .makeText(this, "Exception: "+t.toString(), Toast.LENGTH_LONG)
        .show();
}
if(keyWordList == null){
    keyWordList = new ArrayList<String>();
    return keyWordList;
}

return keyWordList;
}

public void onListItemClick(ListView parent, View v,
    int position, long id) {
startFullNewsEvent(neList.get(position));
}

/**
 * @param newsEvent
 */
public void startFullNewsEvent(NewsEvent ne) {
Intent intent = new Intent(this, FullNewsEvent.class);
intent.putExtra("ne", ne);
this.startActivity(intent);
finish();
}



private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        String page = msg.getData().getString("page");



        try {  
           JSONArray parseArray = new JSONArray(page);  

           for (int i = 0; i < parseArray.length(); i++) {  
               JSONObject jo = parseArray.getJSONObject(i);  

               String title = jo.getString("title");  

               String body =jo.getString("body");

               String pd = jo.getString("postDate");  

               String id = jo.getString("id");


               NewsEvent ne = new NewsEvent(title, pd , body, id);

               boolean unique = true;
               for(NewsEvent ne0 : neList){
               if(ne.getId().equals(ne0.getId())){
                  unique = false;
               }else{
                   unique = true;
               }
               }

               if(unique == true){
               neList.add(ne);
               }
           }  
          } catch (JSONException e) {  
           // TODO Auto-generated catch block  
           e.printStackTrace();  
          }
          ne.setListAdapter(new IconicAdapter());

    }
};

public class IconicAdapter extends ArrayAdapter<NewsEvent> {
IconicAdapter() {
    super(NewsEvents.this, R.layout.rownews, neList);
}

public View getView(int position, View convertView,ViewGroup parent) {
    LayoutInflater inflater=getLayoutInflater();

    View row=inflater.inflate(R.layout.rownews, parent, false);
    TextView label=(TextView)row.findViewById(R.id.label);
    ImageView image= (ImageView)row.findViewById(R.id.icon);

    String body = neList.get(position).getBody();
    body.replaceAll("\\<.*?>", "");
    String title = neList.get(position).getTitle();
    for(String s : keyWordList){
        if(body.contains(s) || body.contains(s.toLowerCase()) ||
            title.contains(s) || title.contains(s.toLowerCase())){
        neList.get(position).setInterested(true);
        }
    }

    if(neList.get(position).isInterested() == true){
        image.setImageResource(R.drawable.star);
    }


    label.setText(neList.get(position).getTitle());

    return(row);
}
}

}

【问题讨论】:

    标签: android


    【解决方案1】:

    首先更改您的 onPostExecute 以包含 @Override:

    @Override
    protected void onPostExecute(Void result) { 
      progressDialog.dismiss();
    }
    

    在你的类定义中包括:

    public class Worker extends AsyncTask<Void, Void, Void>
    

    第一个参数是doInBackground方法的输入类型,第二个参数是onProgressUpdate的输入类型,第三个参数是onPostExecute的输入类型和doInBackground的结果。

    您似乎没有使用 doInBackground 方法的输入参数,因此只需将其更改为 Void... 并同时更改返回类型:

    protected Void doInBackground(Void... paramArrayOfParams) { ... }
    

    这有帮助吗?

    编辑:

    我看到您已更改代码以使用 doInBackground 的参数,因此您的类定义中的第一个参数是正确的。但是,尝试将 Void 作为最后两个参数。并将 doInBackground 的返回类型也更改为 Void。

    像这样:

    public class Worker extends AsyncTask<URL, Void, Void>{
    private Activity ne;
    private ProgressDialog progressDialog;
    private Handler handler;
    
    public Worker(Handler handler, Activity ne){
      this.handler = handler;
      this.ne = ne;
    
    }
    
    @Override
    protected void onPreExecute() {
      progressDialog = ProgressDialog.show(ne,"", "Retrieving News Events", true);
    }
    
    protected void onProgressUpdate(Void... progress) {
    }
    
    @Override
    protected void onPostExecute(Void result) {
      progressDialog.dismiss();
    }
    
    /* (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected Void doInBackground(URL... urls) {
      HttpClient client = new DefaultHttpClient();
      HttpGet get;
    
      try {
            get = new HttpGet(urls[0].toURI());
        ResponseHandler<String> response = new BasicResponseHandler();
        String responseBody = client.execute(get, response);
    
    
        String page = responseBody;
    
        Bundle data = new Bundle();
    
        data.putString("page",page);
        Message msg = new Message();
        msg.setData(data);
    
        handler.sendMessage(msg);
    
      }
      catch (Throwable t) {
        Log.d("UpdateNews", "PROBLEMS");
      }
      return null;
    }
    

    【讨论】:

    • 非常感谢。你介意帮助我了解这里发生了什么吗?仅仅是因为我没有返回正确的值吗?
    • 嗨。问题是,如果您不提供 @Override 注释,编译器将不知道您提供了自己的方法实现。然后它会尝试调用该方法的 AsyncTask 实现,这显然不是你想要的。
    【解决方案2】:

    您没有正确覆盖 asynctask 方法。看一个例子

    http://developer.android.com/reference/android/os/AsyncTask.html

    注意现在他们声明了他们的异步任务

    extends AsyncTask<URL, Integer, Long>
    

    【讨论】:

    • 我已经做出这些更改以反映 android 开发页面,但我的 postExecution 方法永远不会被调用。
    • 您只更改了声明异步任务的方式。你应该进一步研究这个例子。
    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2011-08-24
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多