2012-06-05 85 views
0

我正在實現一個類,extends AsyncTask和我在這個類中執行http請求。該類不是Activity,因爲我想多次使用這個類,所以它位於一個單獨的java文件中。android中的非活動類的活動調用方法

我在我的Activity中實例化這個類的對象,以在單獨的線程中執行http請求。當線程執行時,我想調用我的Activity的方法。

我該如何實施?我需要在我的Activity中的http請求的結果,但我不能處理這個到目前爲止。

這是線程任務的代碼...

public class PostRequest extends AsyncTask<String, Void, String> { 
public String result = ""; 

@Override 
protected String doInBackground(String... urls) { 
    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://bla/index.php?" + urls[0]); 
     // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     InputStream is = entity.getContent(); 

     // convert response to string 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     result = sb.toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return result; 
} 

@Override 
protected void onPostExecute(String result) { 

} 
} 

這是創建線程類我Activity代碼的一部分...

public class ListActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list); 


    PostRequest task = new PostRequest(); 
    task.execute(new String[] { "action=getUsers" }); 
    task.onPostExecute(task.result) { 

    } 
} 

public void Display(String result) { 
    try { 
     JSONArray jArray = new JSONArray(result); 
     JSONObject json_data = jArray.getJSONObject(0); 
     String value = json_data.getString("name"); 
     TextView text = (TextView) findViewById(R.id.value); 
     text.setText(value); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
} 

回答

1

傳遞活動參考構造......

public class PostRequest extends AsyncTask<String, Void, String> { 
public String result = ""; 
private Activity mActivity; 

public PostRequest(Activity activity){ 
      super(); 
     mActivity = activity; 
} 

...... 
+0

但是,我現在如何訪問此活動的方法?我試圖做到這一點像mActivity.Display();但是這不起作用......非常感謝! – Phil123

+1

要麼使用你的活動名稱來代替活動的PostRequest功能的活動只是類型投射活動給你的活動.... –

+0

@DheereshSingh,謝謝,我認爲類型轉換爲活動應該足夠,但你是對的,它應該是專注於真正的活動課程。 – antongorodezkiy

0

您不必做onPostExecute(),因爲在進程doInBackground已經完成之後調用它,然後您可以使用傳遞給AsyncTask的構造函數的活動的引用來在UI上運行任何方法。

只要記住onPostExecute()方法在UI線程上運行,所以在這裏從這個方法你可以嘗試修改你的視圖,如果需要的話。