2014-02-24 35 views
0

我是新手在Java/ADT中,并试图从“活动A”到“活动B”获取数组。该应用程序从网页获取信息,然后将其保存在一对数组中并显示信息。我想点击一个“go to graph”按钮(调用viewallday())重定向到活动B,活动B将显示包含所有这些信息的图形。从BackgroundTask方法获取数组到另一个活动

问题是,它们是自刷新阵列(1秒刷新),并且当应用程序处于图形模式(活动B)时,不希望失去此功能。任何想法如何做到这一点?

提前感谢大家,我从这个网站学到了很多东西。

UPDATE:我试图用Singleton模式做到这一点。但LogCat说:

02-26 22:21:59.300:E/AndroidRuntime(2677):致命例外:主 02-26 22:21:59.300:E/AndroidRuntime(2677):java.lang.RuntimeException :无法启动活动ComponentInfo {com.example.Chispa/com.example.Chispa.Activity_allday}:android.os.NetworkOnMainThreadException 02-26 22:21:59.300:E/AndroidRuntime(2677):引起:android.os .NetworkOnMainThreadException

UPDATE 2:终于明白了!下面是我使用的代码:

下面是活动A代码:

public class MainActivity extends Activity { 

private TextView tvmax, tvmid, tvmin, tvactualval,tvvaloractual,tvdate; 


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

     tvdate=(TextView)findViewById(R.id.tvdate); 
     tvvaloractual=(TextView)findViewById(R.id.tvvaloractual); 
     tvmax=(TextView)findViewById(R.id.tvmaximo); 
     tvmid=(TextView)findViewById(R.id.tvmedio); 
     tvmin=(TextView)findViewById(R.id.tvminimo); 

     new BackGroundTask().execute(); 

     callAsynchronousTask(); 

    } 


    public void callAsynchronousTask() { 
     final Handler handler = new Handler(); 
     Timer timer = new Timer(); 
     TimerTask doAsynchronousTask = new TimerTask() {  
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() {  
         try { 
          BackGroundTask performBackgroundTask = new BackGroundTask(); 
          // PerformBackgroundTask this class is the class that extends AsynchTask 
          performBackgroundTask.execute(); 
         } catch (Exception e) { 
          // TODO Auto-generated catch block 
         } 
        } 
       }); 
      } 
     }; 
     timer.schedule(doAsynchronousTask, 0, 1000); //execute in every 1000 ms 
    } 




    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public class Pair 
    { 
     public String[] bar; 
     public String[] values; 
    } 

     public void viewallday(View view) { 



      Intent intent = new Intent(MainActivity.this, Activity_allday.class); 


      startActivity(intent); 



     } 





    class BackGroundTask extends AsyncTask<Void, Void, Pair> { 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 



     public String[] getValuesGraph(Document doc) { 


       int cont=24,var=7; 
       String bar[] = new String[cont]; 



       /* 
       * Getting elements from the graphic in an array from 0-23. 0 it's 1:00am, 23 it's 00:00am 
       */ 

       for (cont=0; cont < 24; cont++){ 

       String onMouseOver = doc.select("a").get(var+cont).attr("onMouseOver"); 
       bar[cont] = onMouseOver.split("'")[9]; 


       } 


       return bar; 



     } 



     public String[] getValuesFooter(Document doc) { 



      String values[] = new String[7]; 


      /* 
       * Getting elements from the graphic footer 
       */ 

       String delimiters= "[ /]+"; 
       Elements elements = doc.select("td.cabeceraRutaTexto"); 
       elements.size(); // 6 



        /* Getting text from table */ 
        values[0] = elements.get(0).text(); // TITLE 
        values[1] = elements.get(1).text(); // TEXT MAX VALUE 
        values[2] = elements.get(2).text(); // TEXT MIDDLE VALUE 
        values[3] = elements.get(3).text(); // TEXTO MIN VALUE 

        /* Getting numbers from table */ 

        values[4] = elements.get(4).text().split(delimiters)[0]; // NUMBER MAX VALUE 
        values[5] = elements.get(5).text().split(delimiters)[0]; // NUMBER MIDDLE VALUE 
        values[6] = elements.get(6).text().split(delimiters)[0]; // NUMBER MIN VALUE  


        return values; 


     } 


     public Document getUrl(){ 

       try { 
        URL url= new URL("http://www.endesaonline.com/canal/precios/Canal_Preciosdelpool.asp?FECHA=20140226"); 
        /*URL url= new URL("http://www.endesaonline.com/canal/precios/Canal_Preciosdelpool.asp?lang=es&frameId=4064&segmento=1&promocion=");*/ 
        Document doc = Jsoup.connect(url.toString()).get(); 

        return doc;  

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       return null; 
     } 

     @Override 
     public Pair doInBackground(Void... params) { 

      Pair p = new Pair(); 


       GlobalVariables gs = (GlobalVariables) getApplication(); 
       gs.setBar(getValuesGraph(getUrl())); 

       p.bar = getValuesGraph(getUrl()); 

       p.values = getValuesFooter(getUrl()); 


     return p; 


     } 



     public String ActualHourValue() { 

      Format formatter = new SimpleDateFormat("H"); 
      String onlyhour = formatter.format(new Date()); 

      return onlyhour; 


     } 

     public void ShowDateHour(){ 


      Calendar c = Calendar.getInstance(); 
      SimpleDateFormat df3 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss a"); 
      String formattedDate3 = df3.format(c.getTime()); 
      tvdate.setText("Fecha y hora actuales : "+formattedDate3); 

     } 


     @Override 
     protected void onPostExecute(Pair p) { 



      int hour = Integer.parseInt(ActualHourValue()); 
      tvvaloractual.setText(p.bar[hour]+" €/MWh"); 

      tvmax.setText(p.values[4]+" €/MWh"); 
      tvmid.setText(p.values[5]+" €/MWh"); 
      tvmin.setText(p.values[6]+" €/MWh"); 

      ShowDateHour(); 

      /*super.onPostExecute(p.values);*/ 
     } 





    } 




} 

这里是为活动B代码:

public class Activity_allday extends MainActivity { 


private TextView tvall; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.all_day_price); 

     TextView tvall=(TextView)findViewById(R.id.tvall); 

     GlobalVariables gs = (GlobalVariables) getApplication(); 
     String[] s = gs.getBar(); 
     tvall.setText(s[0]);  

    } 

}

这里是一个全局变量类谁捕获我想发送到活动B的阵列:

public class Activity_allday extends MainActivity { 


private TextView tvall; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.all_day_price); 

     TextView tvall=(TextView)findViewById(R.id.tvall); 

     GlobalVariables gs = (GlobalVariables) getApplication(); 
     String[] s = gs.getBar(); 
     tvall.setText(s[0]);  

    } 

}

就这样!希望这将有助于未来的用户。

谢谢大家的帮助。

+0

您是否尝试过将数据保存到某个共享位置(例如应用程序单例)? – Stephan

+0

不,我会在Google上看看关于单身人士和他的申请的问题。 非常感谢你@Stephan – user3321425

+0

你也可以使用parcel。有关更多信息,请参阅[包裹](https://developer.android.com/reference/android/os/Parcel.html)。 – saiarcot895

回答

0

下面是一些你可以尝试:

里面你的AsyncTask,定义一个接口和里面的方法,将数据传回给调用活动和方法内,调用下一个活动,并设置数据作为额外的。

这是最简单的方法。

在您的AsyncTask中,在onPostExecute(result)中,使用try块调用属于上述接口的方法,该接口必须由调用活动实现。

HomeActivity.java

/public class SampleActivity extends Activity implements SampleAsyncTask.OnUpdateListener{ 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    executeAsync(); 
} 

public void executeAsync(){ 

    new SampleAsyncTask(this).execute("someFlagToCheck"); 
} 

@Override 
public void onDataProcessed(String result){ 

    Intent intent = new Intent(this, SecondActivity.class); 
    intent.putExtra("data", result); 
    startActivity(intent); 
} 
} 

SampleAsyncTask。java

public class SampleAsyncTask extends AsyncTask<Void, Void, String>{ 

    Context context; 

    //constructor 
    SampleAsyncTask(Context context){ 
     this.context = context; 
    } 

    @Override 
    public void doInBackground(String... params){ 

     //do something depending on the arguments in params 
     return "data"; 
    } 


    @Override 
    public void onPostExecute(String result){ 

     try{ 
      ((OnUpdateListener) context).onDataProcessed(result); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public interface OnUpdateListener{ 

     public void onDataProcessed(String data); 
    } 
} 

请按照此示例。调用活动实现了AsyncTask的接口并覆盖了当异步任务结果完成时将调用的方法。

我希望这有助于。

+1

谢谢@Eenvincible。我会仔细阅读你推荐的重现它的内容。我正在为这个问题而斗争,而现在我所得到的只是一个调用startActivity的循环。 :P – user3321425

+1

它工作,但也导致一个循环,因为如果我把活动调用放在onPostExecute()中,它会无限地调用startActivity(intent); @Eenvincible 再次感谢。 – user3321425

+0

你好,不幸的是你的回答并没有解决我的问题呢。正如我在我以前的评论中解释的,我有一个使用startActivity(意图)的循环,因为BackGroundTask和扩展他的方法OnPostExecute()每秒刷新一次。@ Eenvincible 如果你能给我一个示例代码它会是非常很有帮助。 非常感谢。 – user3321425

0

SOLUTION:

下面是活动A代码:谁抓住我想要发送的阵列

public class Activity_allday extends MainActivity { 


private TextView tvall; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.all_day_price); 

    TextView tvall=(TextView)findViewById(R.id.tvall); 

    GlobalVariables gs = (GlobalVariables) getApplication(); 
    String[] s = gs.getBar(); 
    tvall.setText(s[0]);  

} 

}

全局变量类:

public class MainActivity extends Activity { 
private TextView tvmax, tvmid, tvmin, tvactualval,tvvaloractual,tvdate; 

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

    tvdate=(TextView)findViewById(R.id.tvdate); 
    tvvaloractual=(TextView)findViewById(R.id.tvvaloractual); 
    tvmax=(TextView)findViewById(R.id.tvmaximo); 
    tvmid=(TextView)findViewById(R.id.tvmedio); 
    tvmin=(TextView)findViewById(R.id.tvminimo); 

    new BackGroundTask().execute(); 

    callAsynchronousTask(); 

} 


public void callAsynchronousTask() { 
    final Handler handler = new Handler(); 
    Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() {  
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() {  
        try { 
         BackGroundTask performBackgroundTask = new BackGroundTask(); 
         // PerformBackgroundTask this class is the class that extends AsynchTask 
         performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 1000); //execute in every 1000 ms 
} 




@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public class Pair 
{ 
    public String[] bar; 
    public String[] values; 
} 

    public void viewallday(View view) { 



     Intent intent = new Intent(MainActivity.this, Activity_allday.class); 


     startActivity(intent); 



    } 





class BackGroundTask extends AsyncTask<Void, Void, Pair> { 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 



    public String[] getValuesGraph(Document doc) { 


      int cont=24,var=7; 
      String bar[] = new String[cont]; 



      /* 
      * Getting elements from the graphic in an array from 0-23. 0 it's 1:00am, 23 it's 00:00am 
      */ 

      for (cont=0; cont < 24; cont++){ 

      String onMouseOver = doc.select("a").get(var+cont).attr("onMouseOver"); 
      bar[cont] = onMouseOver.split("'")[9]; 


      } 


      return bar; 



    } 



    public String[] getValuesFooter(Document doc) { 



     String values[] = new String[7]; 


     /* 
      * Getting elements from the graphic footer 
      */ 

      String delimiters= "[ /]+"; 
      Elements elements = doc.select("td.cabeceraRutaTexto"); 
      elements.size(); // 6 



       /* Getting text from table */ 
       values[0] = elements.get(0).text(); // TITLE 
       values[1] = elements.get(1).text(); // TEXT MAX VALUE 
       values[2] = elements.get(2).text(); // TEXT MIDDLE VALUE 
       values[3] = elements.get(3).text(); // TEXTO MIN VALUE 

       /* Getting numbers from table */ 

       values[4] = elements.get(4).text().split(delimiters)[0]; // NUMBER MAX VALUE 
       values[5] = elements.get(5).text().split(delimiters)[0]; // NUMBER MIDDLE VALUE 
       values[6] = elements.get(6).text().split(delimiters)[0]; // NUMBER MIN VALUE  


       return values; 


    } 


    public Document getUrl(){ 

      try { 
       URL url= new URL("http://www.endesaonline.com/canal/precios/Canal_Preciosdelpool.asp?FECHA=20140226"); 
       /*URL url= new URL("http://www.endesaonline.com/canal/precios/Canal_Preciosdelpool.asp?lang=es&frameId=4064&segmento=1&promocion=");*/ 
       Document doc = Jsoup.connect(url.toString()).get(); 

       return doc;  

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
    } 

    @Override 
    public Pair doInBackground(Void... params) { 

     Pair p = new Pair(); 


      GlobalVariables gs = (GlobalVariables) getApplication(); 
      gs.setBar(getValuesGraph(getUrl())); 

      p.bar = getValuesGraph(getUrl()); 

      p.values = getValuesFooter(getUrl()); 


    return p; 


    } 



    public String ActualHourValue() { 

     Format formatter = new SimpleDateFormat("H"); 
     String onlyhour = formatter.format(new Date()); 

     return onlyhour; 


    } 

    public void ShowDateHour(){ 


     Calendar c = Calendar.getInstance(); 
     SimpleDateFormat df3 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss a"); 
     String formattedDate3 = df3.format(c.getTime()); 
     tvdate.setText("Fecha y hora actuales : "+formattedDate3); 

    } 


    @Override 
    protected void onPostExecute(Pair p) { 



     int hour = Integer.parseInt(ActualHourValue()); 
     tvvaloractual.setText(p.bar[hour]+" €/MWh"); 

     tvmax.setText(p.values[4]+" €/MWh"); 
     tvmid.setText(p.values[5]+" €/MWh"); 
     tvmin.setText(p.values[6]+" €/MWh"); 

     ShowDateHour(); 

     /*super.onPostExecute(p.values);*/ 
     } 





    } 


    } 

活动B到活动B:

public class Activity_allday extends MainActivity { 


private TextView tvall; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.all_day_price); 

    TextView tvall=(TextView)findViewById(R.id.tvall); 

    GlobalVariables gs = (GlobalVariables) getApplication(); 
    String[] s = gs.getBar(); 
    tvall.setText(s[0]);  

} 
} 

谢谢大家的帮助!

相关问题