2012-02-03 2 views
1

.net 웹 서비스와 통신하여 샘플 응용 프로그램에서 작업하고 있습니다. 내 응용 프로그램에서 웹 서비스의 기록을 내 활동 클래스로 가져오고 ArrayAdapter를 사용하여 ListView의 전체 레코드를 표시하고 서비스 클래스를 실행하고 있습니다. 새 레코드를 웹 서비스에서 사용할 수있을 때 웹 서비스에서 최신 레코드를 얻으려면 백그라운드 프로세스에서 다음 SQLite 데이터베이스에 해당 레코드를 저장하고 있습니다.이 프로세스는 백그라운드에서 발생합니다. 여기에서 최신 데이터를 얻고 싶습니다. SQLite DB 및 내 ListView에 추가하십시오. 내가 구현 한 액티비티 클래스를 다음과 같이SqliteDB에서 새 레코드를 사용할 수있을 때 데이터를 가져 와서 UI로 업데이트하는 방법은 무엇입니까?

public class GetMsgsScreen extends ListActivity 
{ 

private LayoutInflater mInflater; 
private Vector<RowData> data; 
RowData rd; 

static String[] userName = null; 
static String[] usrMessages = null; 

private Integer[] imgid = null; 

ShoutRepeatService bg; 

//////////////////////////////////////////////////// 
List<Message> resultShoutMessage; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    resultMessage = new ParseXml().convertMessages(new Model().getMessages("0")); 

    usrMessages = new String[resultMessage.size()]; 
    userName = new String[resultMessage.size()]; 
    imgid = new Integer[resultMessage.size()]; 

    getSharedPreferences("Values", 0).edit().putString("msgid",resultMessage.get(0).getMessageID()).commit(); 

    for(int i=0;i<resultMessage.size();i++) 
    { 

     Log.v("GetMsgsScreen", "resultMessage*******>>>>"+resultMessage.get(i).getMessageText()); 
     Log.v("GetMsgsScreen", "resultNames*******>>>>"+resultMessage.get(i).getUserFirstName()); 
     usrMessages[i] = resultMessage.get(i).getMessageText(); 
     userName[i] = resultMessage.get(i).getUserFirstName(); 
     imgid[i] = R.drawable.person; 


    } 



    /////////////////////////////////////////////////////// 
    mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

      data = new Vector<RowData>(); 
      for(int i=0;i<userName.length;i++){ 

      try { 
       rd = new RowData(i,userName[i],usrMessages[i]); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 
       data.add(rd); 
      } 
       CustomAdapter adapter = new CustomAdapter(this, R.layout.list, R.id.usrName, data); 
       setListAdapter(adapter); 

       bindService(new Intent(GetMsgsScreen.this, RepeatService.class), mConnection, Context.BIND_AUTO_CREATE); 


       getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
       this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
       getListView().setTextFilterEnabled(true); 
      } 

@Override 
protected void onDestroy() { 
    unbindService(mConnection); 
    super.onDestroy(); 
} 


    private ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceConnected(ComponentName className, IBinder binder) { 

      bg = ((RepeatService.MyBinder) binder).getService(); 

      Toast.makeText(GetMsgsScreen.this, "Connected", 
        Toast.LENGTH_SHORT).show(); 

     } 

     public void onServiceDisconnected(ComponentName className) { 
      bg = null; 
     } 
    }; 


     public void onListItemClick(ListView parent, View v, int position, long id) {    

       Toast.makeText(getApplicationContext(), "You have selected " 
           +(position+1)+"th item", Toast.LENGTH_SHORT).show(); 


       } 










    private class CustomAdapter extends ArrayAdapter<RowData> { 

    public CustomAdapter(Context context, int resource, int textViewResourceId, List<RowData> objects) {    

      super(context, resource, textViewResourceId, objects); 
       } 
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 

        ViewHolder holder = null; 
        TextView name = null; 
        TextView messages = null; 
        ImageView i11=null; 
        RowData rowData= getItem(position); 
        if(null == convertView){ 
         convertView = mInflater.inflate(R.layout.list, null); 
         holder = new ViewHolder(convertView); 
         convertView.setTag(holder); 
         } 
         holder = (ViewHolder) convertView.getTag(); 
         name = holder.gettitle(); 
         name.setText(rowData.mName); 
         messages = holder.getdetail(); 
         messages.setText(rowData.mMessage);              

         i11=holder.getImage(); 
         i11.setImageResource(imgid[rowData.mId]); 
         return convertView; 
        } 
         private class ViewHolder { 
         private View mRow; 
         private TextView names = null; 
         private TextView messageText = null; 
         private ImageView i11=null; 

         public ViewHolder(View row) { 
         mRow = row; 
      } 
        public TextView gettitle() { 
         if(null == names){ 
          names = (TextView) mRow.findViewById(R.id.usrName); 
          } 
         return names; 
        }  

        public TextView getdetail() { 
         if(null == messageText){ 
          messageText = (TextView) mRow.findViewById(R.id.msgText); 
           } 
         return messageText; 
        } 
        public ImageView getImage() { 
         if(null == i11){ 
           i11 = (ImageView) mRow.findViewById(R.id.img); 
                } 
          return i11; 
        } 
       } 
       } 

}

다음과 같이 내가 백그라운드 서비스 클래스를 구현 한

:

 public class RepeatService extends Service 
{ 
List<Message> resultMessage; 
String[] userNameLatest = null; 
String[] usrMessagesLatest = null; 
String[] usrMessageID = null; 
String msgID = null; 
private Timer timer = new Timer(); 
private static final long UPDATE_INTERVAL = 500; 

SQLiteDB db; 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 


    pollForUpdates(); 
    super.onCreate(); 
} 



private void pollForUpdates() { 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 

      Log.v("!!!!!!!!!!!!!!!!", "service is calling"); 
      msgID = getSharedPreferences("Values", 0).getString("msgid",""); 
      resultMessage = new ParseXml().convertMessages(new Model().getMessages(msgID)); 
      usrMessagesLatest = new String[resultMessage.size()]; 
      userNameLatest = new String[resultMessage.size()]; 
      usrMessageID = new String[resultMessage.size()]; 

      db = new SQLiteDB(); 

      for(int i=0;i<resultMessage.size();i++) 
       { 
        Log.v("RepeatService", "getMessageID------>"+resultMessage.get(i).getMessageID());    
        Log.v("RepeatService", "getMessageText------>"+resultMessage.get(i).getMessageText()); 
        Log.v("RepeatService", "getUserFirstName------>"+resultMessage.get(i).getUserFirstName()); 

        usrMessagesLatest[i] = resultMessage.get(i).getMessageText(); 
        userNameLatest[i] = resultMessage.get(i).getUserFirstName(); 
        usrMessageID[i] = resultMessage.get(i).getMessageID(); 

    //Save the data into Sqlite db here 

db.insertValues(usrMessageID[i], userNameLatest[i], usrMessagesLatest[i], RepeatService.this); 



       } 

     } 
    }, 0, UPDATE_INTERVAL); 

    Log.v(getClass().getSimpleName(), "Timer started."); 

} 



public class MyBinder extends Binder { 
    ShoutRepeatService getService() 
    { 
     return ShoutRepeatService.this; 
    } 
} 

}

위 클래스 항상 그라운드에서 다시 실행 웹 서비스에서 사용할 수있는 새 레코드가 있으면 레코드를 Sqlite db에 저장합니다.

위의 코드에서 데이터를 Sqlite 데이터베이스에 저장할 수 있습니다 My Activity 클래스의 ListView에 최신 레코드를 어떻게 표시합니까?

는 몸

답변

0

내가 아마 뭔가 새로운 것을 추가 한 경우 서비스로부터 통지 된 BroadcastReceiver를 사용합니다 ......... 코드 설명과 함께 저를 도와주세요. 그런 다음 목록을 업데이트 할 수 있습니다. 모든 통신이 앱에 있기 때문에 LocalBroadcastManager도 확인하십시오.

+0

내 검색어에 대한 대답이 분명하지 않습니다. –

관련 문제