2014-10-16 55 views
0

我使用AsyncTask获取dataserver,如果检查什么是否有new data可用或update变化existing data10秒的AsyncTask在每10秒检查新数据

public class MainActivity extends Activity { 

    CenterLockHorizontalScrollview centerLockHorizontalScrollview; 
    ArrayList<Actors> actorsList; 
    ActorAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     actorsList = new ArrayList<Actors>(); 
     new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"); 

     centerLockHorizontalScrollview = (CenterLockHorizontalScrollview) findViewById(R.id.scrollView);        
    } 


    class JSONAsyncTask extends AsyncTask<String, Void, Boolean> { 

     ProgressDialog dialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog = new ProgressDialog(MainActivity.this); 
      dialog.setMessage("Loading, please wait"); 
      dialog.setTitle("Connecting server"); 
      dialog.show(); 
      dialog.setCancelable(false); 
     } 

     @Override 
     protected Boolean doInBackground(String... urls) { 
      try { 

       //------------------>> 
       HttpGet httppost = new HttpGet(urls[0]); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(httppost); 

       // StatusLine stat = response.getStatusLine(); 
       int status = response.getStatusLine().getStatusCode(); 

       if (status == 200) { 
        HttpEntity entity = response.getEntity(); 
        String data = EntityUtils.toString(entity); 


        JSONObject jsono = new JSONObject(data); 
        JSONArray jarray = jsono.getJSONArray("actors"); 

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

         Actors actor = new Actors(); 

         actor.setName(object.getString("name")); 
         Log.d("Name:", object.getString("name")); 
         actor.setImage(object.getString("image")); 
         Log.d("Image:", object.getString("image")); 

         actorsList.add(actor); 
        } 
        return true; 
       } 

       //------------------>> 

      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return false; 
     } 

     protected void onPostExecute(Boolean result) { 
    dialog.cancel();   
    if(result == false) 
     Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show(); 
    if(actorsList != null) { 
     adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList);  
     centerLockHorizontalScrollview.setAdapter(MainActivity.this, adapter); 
    } 

    } 

} 

回答

2

您可以使用刷新方法进行检查。

void refresh(boolean b){ 
    if(b){ 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"); 
      refresh(true); 
     } 
    }, 10*1000); 
    } 
} 

调用此方法上要对这个您的OnCreate

new JSONAsyncTask().execute("http://microblogging.wingnity.com/JSONParsingTutorial/jsonActors"); 
refresh(true); 
+0

试过你的解决方案,但在每隔10秒我不幸地应用程序已停止 – Sophie 2014-10-16 11:32:48

+0

检查我编辑的答案.. – Chowdary102 2014-10-16 12:07:25

+0

它为你工作? – Chowdary102 2014-10-16 12:50:09

2

有几种方法。最适合的将主要取决于规格,设计&架构决定为你的应用程序。

1) Java的TimerTask。

import java.util.Timer; 
Timer timer = new Timer(); 

timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
    // work 
    } 
}, 0, 10*1000); // 0 - time before first execution, 10*1000 - repeating of all subsequent executions 

timer.cancel(); //cancels the timer and all schedules executions 

2) Android的处理程序。强大的功能和常用于像你问的东西。但是,你必须确保你不是嵌套处理程序。更多信息here;它或多或少地描述了您使用处理程序查找的解决方案。

3) Android的预定警报。即使这会起作用,如果你真的想每10秒运行一次,那么,我会说这可能不是最好的解决方案。但是无论如何,这允许您注册Android的闹钟,这会让您有时间在BroadcastReceiver中运行某些内容,这会在闹钟启动时触发。这里有很多,但你可以在这里学习如何安排闹钟:https://developer.android.com/training/scheduling/alarms.html

+0

感谢您的很好的解释,请检查此:http://pastebin.com/YJMSyB8T – Sophie 2014-10-16 11:39:46

+0

@Sophie,你可以像那样使用它。但是,我建议你避免为你的活动/片段生命周期增加太多业务逻辑。这是因为Android可能会在应用程序的预期行为之外随意破坏,重新创建,暂停,恢复等。在某些情况下,这很难完成,但如果现在对您来说不是问题,那么这很好,您可以稍后重构。 – bmartins 2014-10-16 12:16:43