2012-06-13 43 views
0

嗨,我是Android應用程序的初學者開發人員。我爲大學考試做這項工作。我閱讀了更多的文檔,但是在我的活動中顯示進度對話框時遇到問題,而asynktask從服務器下載Json字符串,然後我必須放入列表視圖。 在我的UI線程中我調用Asynk任務,但線程繼續工作,我不能使用httpGet的結果(工作正常)..我理解這個使用Log.i(...) 爲什麼UI線程不會停止並參加結果?我做了什麼錯誤? 請幫幫我。 ProgressDialog不會阻止UI線程與Asynk任務Android

package my.pack; 


import java.util.concurrent.ExecutionException; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 

public class TestDialogActivity extends Activity 
{ 


ProgressDialog dialog; 
String url = "My URL"; 
String result= "init"; 

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

    DownloadJsonDataTask task = (DownloadJsonDataTask) new DownloadJsonDataTask(result). 
      execute(url); 


    try { 
     String ris = task.get(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    Log.i("GET",result); 



} 



public String requestInfoFromServer() { 
    String request = null; 
    HttpConnection http = HttpConnection.getInstance(); 
    http.setHttpClient(url); 
    request = http.executeRequest(); 

    return request; 
} 

private class DownloadJsonDataTask extends AsyncTask<String, Integer, String> 
{ 

    String Result; 

    protected void onPreExecute() 
    { 
     dialog = new ProgressDialog(TestDialogActivity.this); 
     dialog.setTitle("Download"); 
     dialog.setMessage("Please wait..."); 
     dialog.setIndeterminate(true); 
     dialog.show(); 

    } 

      public DownloadJsonDataTask(String response) { 

       this.Result=response; 
      } 

    protected String doInBackground(String... urls) { 
     String urldisplay = urls[0]; 

     Log.i("STRING URL:", urldisplay); 

     String result = requestInfoFromServer(); 

     return Result; 

    } 


    protected void onPostExecute(String result) { 
     this.Result = result; 
     dialog.dismiss(); 
    } 
} 

} 

回答

0

啊我看到您已聲明具有相似名稱的兩個不同的字符串現在因爲變量名是區分的doInBackground(String... urls)功能問題的敏感是完全合法的有一個名爲Result另一個叫result爲R字符串和和r被看作是兩個不同的字符,所以它們都有獨特的名稱。當這是有效的語法時如何;這很容易出現邏輯錯誤。我相信這是你遇到問題的地方。在函數調用結束時,您沒有爲Result指定Result的任何值,該函數調用的結尾仍然是有效的,並且沒有指向null變量,因爲它聲明瞭Result它確實放入了空字符串的默認值。所以它會編譯並且不會拋出一個空指針錯誤,因爲該變量不爲空,即使其中沒​​有字符串數據,指針仍然指向內存中的一個有效位置,因此就編譯器而言,一切都是好的,它不應該檢查字符串的內容只是傳遞它。與此同時result變量,您將所有數據分配到臨近呼叫結束之前,將加載所有您想要的數據。直到調用結束時纔會被完全忽略,因爲沒有進一步的命令處理它。然後在調用結束時它會被垃圾收集,並且數據永遠不會傳遞,因爲它不會被告知只傳遞該變量Result one

有意義嗎?

+0

是感謝你回答我!我合併了所有的建議,你讓我現在一切正常 – Paolo

1

除了Samir Mangroliya。

task.get();是調用該方法的線程的阻塞調用。因此,在主UI線程上使用它會阻止它,因爲下載smth可能需要幾秒鐘。所以系統檢測到UI線程被阻塞了這麼長時間,並且終止了具有ANR(應用程序不響應)彈出窗口的應用程序。要將此移動結果處理修復爲AsyncTask的onPostExecute()(至少此時應該啓動結果處理,您可以在此處調用某個主機的Activity方法來傳遞結果)。

+0

謝謝你的建議! – Paolo

0

在您的doInBackground()例程中,將下載的結果保存在成員變量Result中。然後,在onPostExecute()中,您將需要閱讀Result並更新您的UI。

如:

private void updateUI(String jsondata) 
{ 
    foo = do.something.to.derive.some.data.from.jsondata. 

    TextView tv = findViewById(R.id.textview1); 
    tv.setText (foo); 
} 

private class DownloadJsonDataTask extends AsyncTask<String, Integer, String> 
{ 

    String Result = null; 
    ... 
    protected String doInBackground(String... urls) 
    { 
      Result = requestInfoFromServer(); 
    } 


    protected void onPostExecute(String result) 
    { 
     dialog.dismiss(); 
     updateUI(Result); 
    } 
    } 
+0

謝謝!我這樣做,現在工作正常!問題是我沒有在asynk任務結束後更新列表視圖。 – Paolo

+0

很高興幫助。請選擇我的答案作爲答案,以便它可以幫助他人。 – wufoo