2012-02-11 3 views
0

Я хочу передать пользовательский векторный объект, содержащий данные из фоновой службы, в действие для обновления пользовательского интерфейса этой активности. Я не могу передать свои данные с помощью намерения. Пожалуйста, помогите мне, что мне нужно делать.Передача объекта через намерение из фоновой службы в действие

Ниже приведен фрагмент кода, который я использую. В приведенном ниже коде я хочу передать список статей в действие.

Vector<RowData> getArticleLog() throws JSONException{ 

    Vector<RowData> articleList = new Vector<RowData>(); 

    RowData rd; 
    InputStream is = null; 
    String result = null; 
    JSONArray jarray = new JSONArray(); 

    //Add data to be send. 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    nameValuePairs.add(new BasicNameValuePair("article_title", "Flying Horse")); 

    try { 

     HttpClient httpclient = new DefaultHttpClient(); 

     // for local server xampp 
     HttpPost httppost = new HttpPost("http://10.0.2.2/groupbook/return_article_log.php"); 

     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 

     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
     Log.i("postData", response.getStatusLine().toString()); 

    } catch (Exception e) { 
     Log.e(TAG, "json error : " + e.toString()); 
    } 
    //convert response to string 
    try { 
     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) { 
     Log.e(TAG, "Error converting result "+e.toString()); 
    } 

    try { 
     jarray = new JSONArray(result); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    //return jArray in the form of Array list; 
    JSONObject rowElement = null; 
    int viewers = 0; 
    int votes = 0; 

    for (int i = 0; i < jarray.length(); i++) { 
     rowElement = jarray.getJSONObject(i); 

     viewers = rowElement.getInt("viewers"); 
     votes = rowElement.getInt("votes"); 

     rd = new RowData(i, 
       rowElement.getString("article_title"), 
       Integer.toString(i), 
       rowElement.getString("last_post_by"), 
       "2 hours", 
       rowElement.getString("catagory_tag"), 
       Integer.toString(viewers), 
       rowElement.getString("privacy_tag"), 
       Integer.toString(votes), 
       rowElement.getString("catagory_title")); 
     articleList.add(rd); 
    } 

    return articleList; 
} 

класс ROWDATA выглядит следующим образом:

public class RowData { 

protected int mId; 
public String articleTitle; 
public String articleCounter; 
public String lastPostBy; 
public String updatedTime; 
public String catagoryTag; 
public String viewingNow; 
public String privacyTag; 
public String votes; 
public String catagoryTitle; 

public RowData(int mId, String articleTitle, String articleCounter, 
     String lastPostBy, String updatedTime, String catagoryTag, 
     String viewingNow, String privacyTag, String votes, 
     String catagoryTitle) { 
    this.mId = mId; 
    this.articleTitle = articleTitle; 
    this.articleCounter = articleCounter; 
    this.lastPostBy = lastPostBy; 
    this.updatedTime = updatedTime; 
    this.catagoryTag = catagoryTag; 
    this.viewingNow = viewingNow; 
    this.privacyTag = privacyTag; 
    this.votes = votes; 
    this.catagoryTitle = catagoryTitle; 
} 
} 

ли следующий путь правильный путь ??

private void DisplayingInfo() throws JSONException{ 
    Log.d(TAG, "entered DisplayLoggingInfo"); 
    intent.putExtra("articleLog", getArticleLog()); 
    sendBroadcast(intent); 
} 

ответ

2

Одна вещь, которую вы можете сделать, это сделать свой собственный класс реализации Serializable (или Parcelable), отправить сериализуемая объект с putExtra() метода к деятельности и использовать getSerializableExtra() на вашей деятельности, чтобы получить его.


Edit 1: быстрый пример:

В пользовательском классе:

import java.io.Serializable; 

@SuppressWarnings("serial") 
public class YourCustomVectorClass implements Serializable { 
    // ... 
} 

В вашей службе, где вы хотите, чтобы начать деятельность:

Intent intent = new Intent(yourContext, yourActivity.class); 
intent.putExtra("theNameOfTheObject", yourObject); 
startActivity(intent); 

В твоей деятельности:

YourCustomVectorClass yourVector = (YourCustomVectorClass) getIntent().getSerializableExtra("theNameOfTheObject"); 

Edit 2: После повторного прочтения вопрос, я понял, что вы передаете Vector из RowData объектов в вашей деятельности.

С Java Vector class реализует Serializable, я думаю, вы не должны ничего, кроме прохождения вектора деятельности с использованием putExtra() и получить его с getSerializableExtra() на операцию делать.

+0

Благодарим вас за такой приятный и быстрый ответ. Пожалуйста, уточните еще одно, что я должен сделать класс RowData Serializable или класс, содержащий метод getArticleLog ?? Выше метода getArticleLog был написан в фоновом режиме .. –

+0

Я проверил с и без Serializable, но когда я использую getSerializableExtra, это исключение для получения. У меня вопрос, что getSerializableExtra возвращает Serializable или String? –

+0

возвращается ** 'Object' **. Вы должны указать его на фактический тип (который является ** 'Vector ' ** в вашем случае). Таким образом, ваш код будет выглядеть так: 'Vector receivedObject = (Vector ) getIntent(). GetSerializableExtra (" theNameOfTheObject ");' – fardjad

Смежные вопросы