2010-12-06 10 views
1

ソリューション:ProgressDialog ActiviyのonCreate()中に問題:Androidの中のボイド

さて、私が見つけた私たちがHandlerを使用する必要があなたの答えからソリューションあなたの答えは完全に

最初に働いていないので、 Runnableをメイン/ UIスレッドに投稿してUpdateDisplay()を実行しますが、重要なものではない他のスレッドではなく、UIThreadの下にProgressDialogを定義してください。ここ

は、最終的なコードである:

public final String RSSFEEDOFCHOICE = "http://www.deals2buy.com/rssgen/tech.xml"; 

public final String tag = "RSSReader"; 
private RSSFeed feed = null; 
private Handler handler = new Handler(); 
private ProgressDialog dialog; 

/** Called when the activity is first created. */ 

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    dialog = ProgressDialog.show(RSSReader.this, "Loading", 
      "Loading, please wait.."); 
    Thread t = new Thread() { 
     public void run() { 
      feed = getFeed(RSSFEEDOFCHOICE); 
      handler.post(new Runnable() { 
       public void run() { 
        dialog.dismiss(); 
        UpdateDisplay(); 
       }; 
      }); 
     } 
    }; 

    t.start(); 
} 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~

問題:

ときAndroidアプリケーション最初のロード、これは何が起こるかです:のURLからRSSコンテンツを取得

  1. getFeed(String url)経由でRSSFeed feedインスタンス変数に解析します。
  2. UpdateDisplay()メソッド経由でListViewのユーザーにこれらのフィードを表示します。これらが起こっている

は、私のようなコンテンツをretrivingしているシステムについてのそれらを知らせるためにユーザーにProgressDialogを見せたかったgetFeed(String Url):RSSFeedが完了したら、ProgressDialogが却下される「ロード、...お待ちください」とUpdateDisplay():voidは次のようになります呼び出される。

これが私の最初の試みである:

public final String RSSFEEDOFCHOICE = "somewhere.xml"; //coming from http 
public final String tag = "RSSReader"; 
private RSSFeed feed = null; 
/** Called when the activity is first created. */ 

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait"); 
    feed = getFeed(RSSFEEDOFCHOICE); 
    dialog.dismiss(); 
    UpdateDisplay(); 
} 

そして、それは私が望むように動作しませんでしたので、それがProgressDialogは表示されません。 ProgressDialogが進行中であることが原因であると考えて以来、別のThreadで処理する必要があります。ここで

は私の第二の試みである:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    Thread t = new Thread() 
    { 
     public void run() 
     { 
      ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait"); 
      feed = getFeed(RSSFEEDOFCHOICE); 
      dialog.dismiss(); 
     } 
    }; 

    UpdateDisplay(); 
} 

このメソッドは、メインスレッドによって処理されていましたので、それはUpdateDisplay()まで大丈夫だったと私は多分私はtの下にそれを入れている必要があると思ったので、それが何かを待っていませんでしたスレッドdialog.dismiss()の後にスレッド。

は、だから私はこのでした:

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    Thread t = new Thread() 
    { 
     public void run() 
     { 
      ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait"); 
      feed = getFeed(RSSFEEDOFCHOICE); 
      dialog.dismiss(); 
        UpdateDisplay(); 
     } 
    }; 
} 

をしかし、その後、デバッガは、実行時に言った:onCreate():voidを扱うのみメインスレッドが届くと、それはそれらを作成するため、ビューはオブジェクトを使用することができます。

今、私はとてもうんざりしていて、プログラミングをやめるように感じています。

いくつかのいずれかが私を助けることができる:/

感謝を事前に。

答えて

1

さて、私はあなたの答えから解決策を見つけた:しかし、あなたはこのようになめらかに行うことができ、迅速な回避策として

まずHandlerを使用して、実行可能ファイルをメイン/ UIスレッドに投稿してUpdateDisplay()を実行し、ProgressDialogUIThreadの下に定義することも重要です。ここで

が最終的なコードです:

public final String RSSFEEDOFCHOICE = "http://www.deals2buy.com/rssgen/tech.xml"; 
public final String tag = "RSSReader"; 
private RSSFeed feed = null; 
private Handler handler = new Handler(); 
private ProgressDialog dialog; 

/** Called when the activity is first created. */ 

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    dialog = ProgressDialog.show(RSSReader.this, "Loading", 
      "Loading, please wait.."); 
    Thread t = new Thread() { 
     public void run() { 
      feed = getFeed(RSSFEEDOFCHOICE); 
      handler.post(new Runnable() { 
       public void run() { 
        dialog.dismiss(); 
        UpdateDisplay(); 
       }; 
      }); 
     } 
    }; 

    t.start(); 
} 
0

あなたはprogressdialog以外のスレッドでリクエストを実行する必要があります。ですので、試してください

public void onCreate(Bundle icicle) { 
super.onCreate(icicle); 
setContentView(R.layout.main); 
ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait"); 
Thread t = new Thread() 
{ 
    public void run() 
    { 
     feed = getFeed(RSSFEEDOFCHOICE); 
     dialog.dismiss(); 
     UpdateDisplay(); 
    } 
}; 
} 

そして、更新の表示で何をするかは、UIスレッドで実行する必要があります。

+0

私はそれを試してみたが、問題は、コードが 'UpdateDisplay'に当たったとき、それは私が私のポストの下部に言及したエラーをスローしました。 – Tarik

1

あなたはAsyncTaskを使うことができます。 onPostExecute(Long result)はUIスレッドで行われるため、Viewオブジェクトを探すときにクラッシュすることはありません。ここで

は何がやりたいことはdoInBackground()でRSSフィードを取得し、その後、onPostExecuteでUIを更新している the asyncTask reference

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

から取った例です。

onCreate()メソッドで、asyncTaskを呼び出します。

new DownloadFilesTask().execute(url1, url2, url3); 
+0

それ以外の単純な解決策はありませんか?私はそれをチェックします。ありがとう。 – Tarik

+1

これは本当にシンプルなので、この問題に対する最良の解決策です。 Googleでは、AsyncTaskを特にこのような場合に作成しました。 – blindstuff

+0

Thanls、私はそれを使用します:) – Tarik

0

実際には、最も良い方法はAsyncTaskです。あなたの答えは完全に

を働いていないので、

private Handler handler = new Handler(); 

public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    Thread t = new Thread() 
    { 
     public void run() 
     { 
      ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait"); 
      feed = getFeed(RSSFEEDOFCHOICE); 
      dialog.dismiss(); 
      handler.post(new Runnable() { 
       public void run() { 
        UpdateDisplay(); 
       } 
      }); 
     } 
    }; 

}

+0

実行時例外が発生しました: 'ERROR/AndroidRuntime(1422):java.lang.RuntimeException:Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません。 ' – Tarik

関連する問題