0

2つのインテントの間に進行状況ダイアログを作成しようとしています。コードは次のとおりです。

        public class DissertationActivity extends ListActivity {
/** Called when the activity is first created. */

public ArrayList<String> book_Array = new ArrayList<String>();
ArrayAdapter<String> adapter;

String href = "";
String href1 = "";
String search_Word = "";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle extras = getIntent().getExtras();
    search_Word = extras.getString("query1");

    adapter = new ArrayAdapter<String>(this, R.layout.list_item_1,
            book_Array);
    setListAdapter(adapter);

    new LoginProgressTask().execute();


}

class LoginProgressTask extends AsyncTask<String, Integer, String> {

    ProgressDialog pDialog = new ProgressDialog(DissertationActivity.this);


    protected void onPreExecute() {
        this.pDialog.setMessage("Progress start");
        this.pDialog.show();


    }


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

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        try {
            Document doc = null;
            Document guestLink = null;

            guestLink = Jsoup.connect("https://aulib.abdn.ac.uk:443/F")
                    .get();
            Element link = guestLink.select("p > a").first();
            href1 = link.attr("href");
            href = href1.substring(0, href1.length() - 2); // removes -0
                                                            // from
                                                            // the

            // href_Array.add(href); //adds href to the array because string
            // wont add to the public var.
            doc = Jsoup.connect(
                    href + "&request=" + search_Word
                            + "&find_code=WRD&adjacent=N&x=0&y=0").get();
            // System.out.println(doc);
            Elements headings = doc.select("td:eq(3)");
            // System.out.println(headings);
            for (Element heading : headings) {
                // System.out.println(heading.text());
                String j = heading.text();

                book_Array.add(j);

            }

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

        }

        book_Array.remove(0);
        adapter.notifyDataSetChanged();
        book_Array.remove(1);
        adapter.notifyDataSetChanged();
        book_Array.remove(2);
        adapter.notifyDataSetChanged();
        book_Array.remove("Search");
        adapter.notifyDataSetChanged();
        book_Array.remove(" | ");
        adapter.notifyDataSetChanged();
        book_Array.remove(0);
        adapter.notifyDataSetChanged();

        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position,
                    long id) {
                // Context context = getApplicationContext();
                int query = position;
                // String text = book_Array.get(position);
                // int duration = Toast.LENGTH_SHORT;
                // Toast toast = Toast.makeText(context,
                // String.valueOf(position), //shows the postion in the
                // array
                // list
                // duration);
                // toast.show();

                Intent intent = new Intent(DissertationActivity.this,
                FullDetailsActivity.class);
        intent.putExtra("href", href);
        intent.putExtra("query1", (int) query);
        intent.putExtra("search_Word", search_Word);

        startActivity(intent);
            }

        });
        return null;
    }


    protected void onPostExecute(String...params) {

        pDialog.dismiss();


}
      }}

runWorker(ThreadPoolExecutor.java:1088)04-23 17:45:16.752:E / AndroidRuntime(2425):java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:581)04-23 17:45: 16.752:E / AndroidRuntime(2425):java.lang.Thread.run(Thread.java:1019)04-23 17:45:16.752:E / AndroidRuntime(2425):原因:android.view.ViewRoot $ CalledFromWrongThreadException :ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。04-23 17:45:16.752:E / AndroidRuntime(2425):android.view.ViewRoot.checkThread(ViewRoot.java:2941)04-23 17:45:16.752:E / AndroidRuntime(2425):android view.ViewRoot.focusableViewAvailable(ViewRoot.java:1717)04-23 17:45:16.752:E / AndroidRuntime(2425):android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:452)04-23 17:45: 16.752:E / AndroidRuntime(2425):android.view.ViewGroupで。

プログレスバーはなんとかロードされますが、コードは数秒後にクラッシュします。doInBackgroundまたはpostExecuteのどこにインテントを配置する必要がありますか?インテントがpostExecteにあることを意図している場合、doInBackgroundからpostExecuteに変数を渡すにはどうすればよいですか?

コードの何が問題になっていて、クラッシュしないように何を変更する必要がありますか?

4

2 に答える 2

1

UIで更新できますdoInBackGround()

ログトレースを見ると、doInBackGroundでUIを更新しようとしていることがわかります。これは、代わりにrunOnUiThreadメソッドを呼び出すことはできず、すべてが正常に実行されます。

YourActivity.this.runOnUiThread(new Runnable() {                                            
public void run() {
 ListView lv = getListView();
 lv.setTextFilterEnabled(true);
 // do all UI related stuff in this
}
}
于 2012-04-23T16:51:09.240 に答える
0

私の推測では、あなたはラインのためにそれらのクラッシュを見ているかもしれません

adapter.notifyDataSetChanged();

それらを削除してみてください。と呼ばれるもう1つのメソッドがあります

protected void onProgressUpdate(Integer... progress)

このメソッドを使用して、メインUIスレッド、進行状況と通信することをお勧めします。それが役立つかどうかはわかりません。しかし、更新を行う必要がある場合は、doInBackgroundおそらく使用する必要がありますrunOnUiThread

于 2012-04-23T17:08:33.287 に答える