2012-09-17 130 views
0

我是一般的android開發和軟件編程的新手,並且相信我的應用程序中存在線程問題。該應用程序所做的是根據對api的兩個查詢搜索兩組結果,並將每組結果存儲在其自己的列表中。生成的新列表僅包含兩個列表中的元素。該應用在桌面上的虛擬設備中運行,但掛在我的Galaxy Nexus上。我正在使用arraylist,但我想知道是否hashset在完成這種類型的操作時會更快。以下是我的主要活動。 getfirst和secondID在asynctask以及getfirst和secondtitle中完成,以防止networkonmainthread異常。這是線程這個應用程序的最佳方式嗎?謝謝你的幫助。我如何讓我的應用程序不掛在設備上

@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; 
} 
} 

回答

0

我認爲這是正確的方法:使用AsyncTask是一種簡單的方法來阻止您的應用程序凍結用戶界面。

但我真的不明白下面這行是做什麼的。

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

其實我從來沒有見過它。無論如何,你在ArrayList中管理多少條記錄? 10,100,1000,1 000 000?

如果您正在處理大量記錄,您的手機將需要一定的時間才能完成操作,並且無法將其縮小。唯一的解決方案,如果集合太大,試圖減少它可能直接在你的服務器或當你建立你的ArrayList。

0

我不一定跟着AsyncTask被創建並投入使用的地方,但似乎將整個getData方法放在AsyncTask上是個好主意。除此之外,如果它在設備上運行,但不在設備上,我的第一個懷疑就是網絡訪問。確保您的設備不僅可以訪問互聯網,還可以訪問運行遠程查詢所需的服務。誤解手機無法看到與我們的臺式機相同的主機很常見。另外,如果您的手機在Wifi上漫遊,請檢查Wifi網絡是否允許訪問該服務。遠程查詢服務是Web服務嗎?它是你嘗試運行的DBMS SQL調用嗎?查詢是否需要特定的網絡端口?

+0

在getData中,存在對getFirstID和getSecondID以及getSecondTitle和getSecondTitle的調用。這些clases實現asynctask並查詢api。我想嘗試必須getData擴展asynctask,但無法想出一個方法來傳遞兩個參數,因爲asynctask在String中進行...在我的研究中並通過玩弄它我的印象是asynctask只會在stringbuilder可變長度。如果有一種方法,我可以傳遞兩個參數即。 searchURLOne和searchURLTwo或者一個字符串數組,即[[searchURLOne] [searchURLTwo]],這是值得嘗試的。 – user881667

+0

讓我們先弄清楚如何讓它工作,然後弄清楚如何優化它。當你說它掛在設備上時,這是否意味着它只需要很長時間,或者是否意味着它會無限期地掛起?如果它永遠掛起,請檢查手機和桌面之間的網絡差異。 – Cliff

+0

asyncTask可以使用您選擇的指定類型的任意數量的參數。你當然可以擴展它並傳遞任何你想要的東西。 –

0

這一次似乎阻塞UI線程:

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

更好地使用一個新的線程做長期的工作,一旦完成,通知有關新數據的UI線程。

您可以使用asyncTask使其更容易。如果您更喜歡普通線程,則在線程完成後使用handler(並使用handler.post)或使用runOnUiThread

如果你使用hanlder,不要忘記在線程本身之外創建它。

作爲一名新的android開發者,您應該觀看google IO視頻。他們可以幫助很多。從2010年到2012年觀看視頻。

相關問題