0

さて、私はアンドロイドにいくつかの問題を抱えています。多分それは単純ですが、私はアンドロイドの世界ではかなり新しいです(実際には3、4日)。センサーネットワークからデータを読み取るためのasyncTaskを実行するアクティビティがあります。非同期タスクは、それ自体がループであり、センサーネットワークを常に「取得」し続ける関数l.read()のみを実行し、新しいノードがセンサーネットワークに参加すると、UIスレッドにもう1つのノードが参加したことを通知します。そのため、ビューを更新する必要があります(witchにはノードが存在しないことを示すタブが1つしかないため、ノードを1つ使用できるようにする必要があります。これに加えて、このタブのxmlレイアウトファイルをロードする必要があります)。ビューを後で作成してタブを追加する関数を実行します(onCreateで呼び出すと機能するため、適切に機能します)、アプリは応答しなくなります、ただし、Logcatではエラーは発生しません。動作しているように見えますが、何も表示されていません。

どうか、このコードをすべて読んでくれるとは思わないでください。私の問題を説明するためだけに。2日経ちましたが、まだ解決策を求めています。

主な活動:

public class PrincipalActivity extends Activity implements OnClickListener
{

private Button Send;
private Button Options;
private TextView ERROR;
private Bundle extras;
private String IP;
private String PORT;
private TabHost tabs;
private ligação l;
View m_vForm;
TabHost tabHost;
CustomView Cview;
ReadsData read;



//constructor
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    CustomView vv = new CustomView(PrincipalActivity.this,0);
    setContentView(vv);

    //instanciating the objects
    IP = new String();
    PORT = new String();      
    extras = getIntent().getExtras();
    IP = extras.getString("IP");  //get the IP and port from the previous activity
    PORT = extras.getString("PORT");
    ERROR = (TextView) findViewById(R.id.ERROR);   
    tabs = (TabHost) findViewById(R.id.tabhost);
    tabs.setup();
    Send = (Button) findViewById(R.id.SendCommand);
    Send.setOnClickListener(this);
    Options = (Button) findViewById(R.id.Options);
    Options.setOnClickListener(this);
  //=========================

    CreateAView("No Nodes",false);
    l = new ligação(IP, Integer.parseInt(PORT),this);  //CLASS LIGAÇÃO
   // RunnableThread rT1 = new RunnableThread("t1",l,this);

    read = new ReadsData();
    read.execute();

    //Textviews (Values)


}

public void AddUpdateNodes(Nodes n,int func)
{
    //func is 0 if it it to add a node or 1 if it is to update an existing one
    if(func == 0)
    {
        String s = new String();
        s+= n.GETSourceNodeID();
        CreateAView(s, true);
        Cview.addNewNode(n);        
    }
    if(func == 1)
        Cview.UpdateNodeInformation(n);
}


public void onClick(View v) 
{

    if(v == Send)
    {
        // if i call CreateAView here it works ok
        ERROR.setText(IP);

    }

    if(v == Options)
    {

        ERROR.setText(PORT);
    }
}

    // CREATING A VIEW WITH THE TABS
public void CreateAView(String s,boolean nodesAvailable)
{

     m_vForm = createTABForm(s,nodesAvailable);
     setContentView(m_vForm);
}

 private ViewGroup createTABForm(String s,boolean nodesAvailable1)
 {
    final boolean nodesAvailable = nodesAvailable1;

        // construct the TAB Host
        tabHost = new TabHost(this);
        tabHost.setLayoutParams(  new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)  );

        // the tabhost needs a tabwidget, that is a container for the visible tabs
        TabWidget tabWidget = new TabWidget(this);
        tabWidget.setId(android.R.id.tabs);
        tabWidget.setBackgroundColor(Color.BLUE);

        tabHost.addView(tabWidget, new LinearLayout.LayoutParams(      LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)   ); 

        // the tabhost needs a frame layout for the views associated with each visible tab
        FrameLayout frameLayout = new FrameLayout(this);
        frameLayout.setId(android.R.id.tabcontent);
        frameLayout.setPadding(0, 65, 0, 0);
        tabHost.addView(frameLayout, new LinearLayout.LayoutParams(   LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)   ); 

        // setup must be called if you are not initialising the tabhost from XML
        tabHost.setup(); 

        // create the tabs
        TabSpec ts = tabHost.newTabSpec("TAB_TAG_2");
        ts.setIndicator(s); // creating a tabb with the specified name
        ts.setContent(new TabHost.TabContentFactory(){
             public View createTabContent(String tag)
             {
                 // -- this tab contains a single control - the listview -- //
                 Cview = new CustomView(PrincipalActivity.this,nodesAvailable);
                 return Cview;   // IS AN OBJECT FROM THE CLASS CustomView
             }
        });

        tabHost.addTab(ts); 
        return tabHost;
    } 




 ////////////////////////////////////////////////////////////////
 //Async Tasks
 private class ReadsData extends AsyncTask 
 {

    @Override
    protected Object doInBackground(Object... params) 
    {
        l.read();
        return null;
    }

    protected void onPostExecute()
     {
        l.SocketClosed_();
     }
 }

}

    //CLASS CUSTOM VIEW

 public CustomView(Context context,boolean NodesAvailable)
 {
   super(context);

   if(NodesAvailable) //loads a layout
   {
       LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

       View view=layoutInflater.inflate(R.layout.finallayout,this);

       //only after inflate
        ADC0 = (TextView) findViewById(R.id.ADC00);

   }
   else  // loads another layout
   {
       LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       View view=layoutInflater.inflate(R.layout.no_nodes,this);
   }

 }



 public void addNewNode(Nodes n)
 {
     String s = new String();


     s = new String();
     s += n.GETSensores(0).GETvalor();
     ADC0.setText(s);


 }

 public void UpdateNodeInformation(Nodes n)
 {
     String s = new String();
     s += n.GETSourceNodeID();

     //if(s.equals())

 }

}

    //SOME CODE OF LIGAÇÃO CLASS
  public class ligação 
  {
      protected PrincipalActivity cont;
    //Constructors
    public ligação(String ss,int Port,PrincipalActivity c){ s=ss; p=Port;cont = c; }

       public void read() 
   {
           while(flag)
           {
              ...
              cont.AddUpdateNodes(node, 0);
              ...
           }

よろしくお願いします

4

1 に答える 1

0

すべてのUI操作はUIスレッドで実行する必要があるため、アプリがクラッシュしないのは奇妙です。おそらく、asynctaskのスレッドがクラッシュしたが、uiスレッドはクラッシュしなかったためであり、それが何も起こらない理由です。とにかく、asyncTask内でビューを作成/更新するには、次のいずれかを使用できます。これにより、UIスレッドに何かを投稿して、できるだけ早く実行できます。

  1. ハンドラーを使用します。
  2. publishProgressを使用します。
  3. runOnUiThreadを使用します。
于 2012-05-29T12:09:45.913 に答える