2011-01-24 3 views
2

私はこれを正しく実行していると思います。私のアクティビティクラスでは、警告ダイアログが表示され、データロードは実行されますが、離れて。ここに私のAsyncTaskコードがあります: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); 
} 
} 

}

答えて

1

まず第一に@Overrideを含めるようにonPostExecuteを変更宣言する例

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

とノートを見てみましょうクラス定義には次のものが含まれます:

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

最初のパラメータはdoInBackgroundメソッドへの入力の型、2番目はonProgressUpdateへの入力の型、3番目はonPostExecuteへの入力の型およびdoInBackgroundからの結果です。あなたはdoInBackgroundメソッドに入力パラメータを使用しているようですが、見えない

、これだけ...無効になり、さらに、同様戻り値の型を変更することを変更します。

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

は、このヘルプをしていますか?

編集:私はあなたのクラス定義の最初のパラメータが正しいので、あなたは、doInBackgroundのパラメータを使用するようにコードを変更していた見た

。しかし、最後の2つのパラメータとしてVoidを入れてみてください。また、doInBackgroundの戻り値の型も無効に変更します。このよう

:私はアンドロイドのdevのページを反映するために、これらの変更を行ってきましたが、私のpostExecutionメソッドが呼び出されないばかりん

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; 
} 
+0

ありがとうございました。ここで何が起こっているのか理解してもらえますか?私は正しい値を返すことがなかったのか? – NickTFried

+0

こんにちは。問題は、@Overrideアノテーションを指定しないと、コンパイラはメソッドの独自の実装を提供したことを知りません。次に、メソッドのAsyncTask実装を呼び出そうとしますが、これは明らかに意図したとおりに行われません。 –

1

あなたは正しくasynctaskメソッドをオーバーライドしていません。あなたに

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

を:今、彼らは彼らのasynctask

extends AsyncTask<URL, Integer, Long> 
+0

。 – NickTFried

+0

asynctaskを宣言する方法だけを変更しました。この例をさらに勉強してください。 – Falmarri

関連する問題