0

私はAndroid開発とソフトウェアプログラミング全般に不慣れで、アプリにスレッドの問題があると信じています。アプリが行うことは、APIへの2つのクエリに基づいて2つの結果セットを検索し、各結果セットを独自のリストに保存することです。両方のリストにある要素のみを含む新しいリストが生成されます。アプリはデスクトップの仮想デバイスで実行されますが、GalaxyNexusでハングします。私はこれにarraylistを使用していますが、おそらくハッシュセットがこのタイプの操作を実行するのに高速であるかどうか疑問に思っています。以下は私の主な活動です。getfirstとsecondIDは、networkonmainthread例外を防ぐために、getfirstとsecondtitleと同様にasynctaskで実行されます。これがこのアプリケーションをスレッド化するための最良の方法ですか?助けてくれてありがとう。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.totlayout);

    //set the UI elements
    searchOne = (EditText) findViewById(R.id.searchOne);
    searchTwo = (EditText) findViewById(R.id.searchTwo);

    findMovies = (Button) findViewById(R.id.findMovies);

    searchOne.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            //make person search url1
            final StringBuilder personSearchURLOne = new StringBuilder(getName.getName1(searchOne)); 
            searchURLOne = personSearchURLOne.toString();
            return false;
        }
    });

    searchTwo.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            //make person search url2
            final StringBuilder personSearchURLTwo = new StringBuilder(getName.getName2(searchTwo));
            searchURLTwo = personSearchURLTwo.toString();

            return false;
        }
    }); 
}
public void getData(String searchURLOne, String searchURLTwo){
    try{
        //get ID 1 
        idOne = new getFirstID().execute(searchURLOne).get();
        Log.d("JSONArray idOne", idOne.toString());

       //get ID 2
       idTwo = new getSecondID().execute(searchURLTwo).get();
       Log.d("JSONArray idTwo", idTwo.toString());

       //make credit search url1
       final StringBuilder creditURLOne = new StringBuilder(buildCreditURL.getCreditURLOne(idOne));
       final String creditOne = creditURLOne.toString(); 
       Log.d("creditOne contains", creditOne);

       //make credit search url2
       final StringBuilder creditURLTwo = new StringBuilder(buildCreditURL.getCreditURLTwo(idTwo));
       final String creditTwo = creditURLTwo.toString();

       //get array of tiles for credit url 1 
       titleOne = new getFirstTitle().execute(creditOne).get();
       Log.d("titleOne Contains", titleOne.toString());

       //get array of titles for credit url 2
       titleTwo = new getSecondTitle().execute(creditTwo).get();

       //parse out common films into new array 
       myCommonFilms = new ArrayList<String>(commonFilms.getCommonFilms(titleOne, titleTwo));
    }
    catch(InterruptedException e){
        e.printStackTrace();
    }catch(ExecutionException e){
        e.printStackTrace();
    }



}
public void displayResults(View view) throws InterruptedException, ExecutionException{
    //do something in response to button
    getData(searchURLOne, searchURLTwo);
    Intent intent = new Intent(this, DisplayResultsActivity.class).putStringArrayListExtra("myCommonFilmsList", myCommonFilms);
    startActivity(intent);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.totlayout, menu);
    return true;
}
}
4

3 に答える 3

0

これはUIスレッドをブロックしているようです:

   titleOne = new getFirstTitle().execute(creditOne).get();

長いジョブを実行するために新しいスレッドを使用することをお勧めします。終了したら、新しいデータについて UI スレッドに通知します。

asyncTask を使用して簡単にすることができます。通常のスレッドを使用する場合は、を使用するhandler(およびhandler.postを使用する) かrunOnUiThread、スレッドが終了したら使用します。

hander を使用する場合は、スレッド自体の外で作成することを忘れないでください。

新しい Android 開発者として、Google IO ビデオをご覧ください。彼らは多くを助けることができます。2010 年から 2012 年までのビデオをご覧ください。

于 2012-09-17T22:19:39.023 に答える
0

私はそれが正しい方法だと思います.AsyncTaskを使用すると、アプリがUIをフリーズするのを防ぐ簡単な方法です.

しかし、次の行が何をするのかよくわかりません。

idOne = new getFirstID().execute(searchURLOne).get();

実は、今まで見たことがありません。とにかく、 ArrayList でいくつのレコードを管理していますか? 10、100、1000、1 000 000 ?

大量のレコードを操作している場合、電話機が操作を完了するのに一定の時間がかかり、それを減らすことはできません. セットが大きすぎる場合の唯一の解決策は、サーバー上で直接、または ArrayList を構築するときに、それを削減しようとすることです。

于 2012-09-17T21:18:38.357 に答える
0

AsyncTask が作成されて実行される場所を必ずしもフォローしているわけではありませんが、getData メソッド全体を AsyncTask に配置することをお勧めします。それはさておき、デバイスでは機能するがデバイスでは機能しない場合、最初に疑うのはネットワークアクセスです。デバイスがインターネットだけでなく、リモート クエリを実行する必要があるサービスにもアクセスできることを確認してください。携帯電話はデスクトップと同じホスト コンピューターを認識できないと誤解するのはよくあることです。また、電話が Wifi でローミングしている場合は、Wifi ネットワークでサービスへのアクセスが許可されていることを確認してください。リモート クエリ サービスは Web サービスですか? 実行しようとしているのは DBMS SQL 呼び出しですか? クエリには特定のネットワーク ポートが必要ですか?

于 2012-09-17T21:58:56.030 に答える