2016-01-13 49 views
1

我有一個android應用程序,它由一個活動和一個擴展AsyncTask的java類組成。所以我在java類中有一個名爲resFromServer 的字符串,我想將它顯示在適當的Android小部件(如Alertdialog)中的消息中。在活動小部件中顯示java類的字符串

我想有人幫助我如何從活動

public class JSONTransmitter extends AsyncTask<JSONObject, JSONObject, JSONObject> { 

    String url = "http://192.168.1.8:89/Derdeery/b.php"; 



    protected JSONObject doInBackground(JSONObject... data) { 
     JSONObject json = data[0]; 

     HttpClient client = new DefaultHttpClient(); 
     HttpConnectionParams.setConnectionTimeout(client.getParams(), 100000); 
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build()); 
     JSONObject jsonResponse = null; 

     HttpPost post = new HttpPost(url); 

     try { 
      StringEntity se = new StringEntity("json="+json.toString()); 

      post.addHeader("content-type", "application/x-www-form-urlencoded"); 
      post.setEntity(se); 

      HttpResponse response; 
      response = client.execute(post); 
      String resFromServer = org.apache.http.util.EntityUtils.toString(response.getEntity()); 


       Log.i("Response from server", **resFromServer**); 


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

     return jsonResponse; 
    } 

} 

訪問字符串活動

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     } } 

回答

0

通過你的活動爲參數AsyncTask類的構造函數:

class MyAsyncTask extends AsyncTask<URL, Integer, Long> { 

    Activity mActivity; 

    public MyAsyncTask(Activity activity) { 
     mActivity = ativity; 
    } 

T母雞更新您的活動:

@Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     int id = mActivity.findViewById(...); 
    } 

你不應該使用doInBackground方法來更新活動。 使用onPostExecute,因爲它使用主線程。

2

正確的解決方案:創建AsyncTaskinstance並進行回調以獲得對任何Activity的響應。所有將實現此接口的活動都可以檢索AsyncTask的結果。這更加靈活,只需一個AsyncTask即可用於多個活動。

你必須創建實例並返回String響應,在AsyncTask:然後

public class JSONTransmitter extends AsyncTask<JSONObject, Void, String> { 
    private AsyncCallback asyncCallback; // callback variable 

    // constructor 
    public JSONTransmitter(Context context) { 
     // attach the callback to any context 
     asyncCallback = (AsyncCallback) context; 
    } 

    // create the interface 
    public static interface AsyncCallback { 
     void onResponse(String res); 
    } 

    ... 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if (asyncCallback != null) { 
      // call the onResponse method for callback 
      asyncCallback.onResponse(result); 
     } 
    } 
} 

,你可以通過設置Context如下實施任何Activity回調:

public class MainActivity extends Activity implements JSONTransmitter.AsyncCallback { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // set the Context to the AsyncTask when you create it 
     // in order to return here and execute the request 
     new JSONTransmitter(this).execute(...); 
    } 

    ... 
    @Override 
    public void onResponse(String res) { 
     // handle the string response when it's called from onPostExecute() 
     Log.v("From_MainActivity", "AsyncTask returns this: "+res); 
    } 
} 

因此,你可以在ActivityresFromServer(結果字符串)AsyncTask類中做你想要的。

+0

我得到這個錯誤AsyncCallback無法解析到類型 – JavaFan

+0

我沒有任何錯誤,@JavaFan。因爲你的AsyncTask類型('AsyncTask '),所以我只需要通過'JSONObject'來更改返回'String',否則我可以運行腳本。你使用Eclispe嗎? – Fllo

+0

是否有一個名爲AsyncCallback的類?我使用Eclipse – JavaFan

相關問題