0

私は進行状況ダイアログを適切に実装する方法を学ぼうとしているアンドロイドの初心者です。OnCreate中にリストビューにデータを入力する前に、Twitterの結果をクエリして解析するコードから始めました。これは完璧に機能しました。数秒かかるのでプログレスバーを追加したかったのですが、プログレスバーを追加してからコードが機能しなくなりました。解析中にnullpointerエラーが発生し、「ビュー階層を作成した元のスレッドのみがビューにアクセスできます」というエラーが原因でアプリがクラッシュします。これを解決するためのヘルプをいただければ幸いです。

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    dialog = new ProgressDialog (MainActivity.this);
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setMessage("Loading... please wait");
    dialog.setIndeterminate(false);
    dialog.setMax(100);
    dialog.setProgress(0);
    dialog.show();

    Runnable runnable = new Runnable() {
        @Override
        public void run() {

    tweets = new ArrayList<Tweet>();

    try {           
        JSONObject jArray = JSONfunctions.getJSONfromURL("http://search.twitter.com/search.json?q=gold%20silver%20news&rpp=15");
        JSONArray parsedTwitter = jArray.getJSONArray("results");       
        if(parsedTwitter.equals("") ){
            Toast.makeText(MainActivity.this, "No nearby locations", Toast.LENGTH_LONG).show();
        }else{
            for (int i = 0; i < parsedTwitter.length(); i++) {
            JSONObject parsedspecific = parsedTwitter.getJSONObject(i);             
        if (i == 0){                
            String from_user = parsedspecific.getString("from_user");
            String text = parsedspecific.getString("text"); 
            String profile_image_url = parsedspecific.getString("profile_image_url");  
            Tweet tweet0 = new Tweet(from_user, text, profile_image_url );
            tweets.add(tweet0);                 
            }
dialog.setProgress(50);
        if (i == 1){                
            String from_user = parsedspecific.getString("from_user");
            String text = parsedspecific.getString("text"); 
            String profile_image_url = parsedspecific.getString("profile_image_url");  
            Tweet tweet1 = new Tweet(from_user, text, profile_image_url );
            tweets.add(tweet1);                 
            }

      }
            }

    } catch (Exception e) {
        Log.e("log_tag", "Error parsing data "+ e.toString());
    }

    ListView listView = (ListView) findViewById(R.id.ListViewId);      
    listView.setAdapter(new UserItemAdapter(MainActivity.this, R.layout.listitem, tweets));


    dialog.setProgress(100);
    dialog.dismiss();
        }
    };

    new Thread(runnable).start();


}
4

2 に答える 2

1

これは、ダイアログが別のスレッドにあり、それを混乱させるためのハンドラーが必要であることを意味します。OnCreate()メソッドの前に次の行を追加してみてください。

Handler handler;

次に、OnCreateメソッドで、ハンドラーをインスタンス化して、ダイアログと同じスレッドに配置します。

handler = new Handler();

最後に、別のスレッドからダイアログを更新するには、次のようなハンドラーを使用する必要があります。

handler.post(new Runnable(){
public void run(){
//Do here whatever you want to do to the dialog
dialog.setProgress("whatever integer");
}
});

お役に立てれば

于 2012-09-15T01:57:55.027 に答える
0

Main ThreadAndroidでは、デフォルトのスレッドであるで、ある種のUI操作のみを実行する必要があります。そうしないと、現在発生しているエラーが発生します。Handler別のスレッドでの使用方法またはAsyncTask長期進行操作の実行方法を学習してみてください。

于 2012-09-15T01:50:15.607 に答える