繁体   English   中英

如何将字符串的值从线程转移到另一个?

[英]How to transfer the value of the string from thread to another?

我正在使用Jsoup解析网站的一部分,然后将其放入字符串中。 我想将此字符串可视化为textView,但是由于只有创建了textView的线程才能修改它,因此我需要将字符串的值传递到主线程中。 怎么样?

这是代码:(忽略tabhost的内容)

public class NewsAndAnnouncements extends Activity {

    TabHost host;
    FlyOutContainer container;
    Button bttoggle;
    Button bt1;
    String loggity;
    TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.container = (FlyOutContainer) this.getLayoutInflater().inflate(
                R.layout.newsandannouncements, null);
        this.setContentView(container);

        host = (TabHost) findViewById(R.id.tabhost);
        host.setup();

        TabSpec specs = host.newTabSpec("TAGGITY EINZ");
        specs.setContent(R.id.tab1);
        specs.setIndicator("News");
        host.addTab(specs);

        specs = host.newTabSpec("TAGGITY ZWEI");
        specs.setContent(R.id.tab2);
        specs.setIndicator("Notices");
        host.addTab(specs);

        specs = host.newTabSpec("TAGGITY DREI");
        specs.setContent(R.id.tab3);
        specs.setIndicator("Events");
        host.addTab(specs);

        tv1 = (TextView) findViewById(R.id.textView1);

        /*
         * bttoggle = (Button) findViewById(R.id.bttoggle); bt1 = (Button)
         * findViewById(R.id.Button1);
         * 
         * bttoggle.setOnClickListener(new OnClickListener() {
         * 
         * @Override public void onClick(View v) { // TODO Auto-generated method
         * container.toggleMenu(); } });
         * 
         * bt1.setOnClickListener(new OnClickListener() {
         * 
         * @Override public void onClick(View v) { // TODO Auto-generated method
         * container.toggleMenu(); } });
         */

        Thread newsThread = new Thread() { 
            public void run() {

                Document doc = null;
                try {
                    doc = Jsoup
                            .connect(
                                    "http://acs.bg/Home/About_ACS/News_and_Events/News.aspx")
                            .get();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                Elements myin = doc.getElementsByClass("news_list");
                loggity = myin.toString();


                        Log.i("ELEMENTS HTML", loggity);

            }
        };
        newsThread.start();

        tv1.setText(loggity);

    }

}

尝试使用AsyncTask而不是Thread。 要在ui线程上修改视图,请在活动中使用runOnUiThread()方法。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        tv1.setText("...");
    }
});

使用AsyncTask而不是原始线程:

new AsyncTask<URL, Object, Document>() {
    protected Document doInBackground(URL... urls) {
        // parse URL and return document
    }

    protected void onPostExecute(Document result) {
        // this runs in UI thread
        // show document in UI
    }
}).execute(myURL);

有两种方法可以做到-

1)-使用AsyncTask

2)-使用处理程序

Thread newsThread = new Thread() 
{ 
            public void run() 
            {
                Document doc = null;
                try {
                    doc = Jsoup
                            .connect(
                                    "http://acs.bg/Home/About_ACS/News_and_Events/News.aspx")
                            .get();
                } 
                catch (IOException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                Elements myin = doc.getElementsByClass("news_list");
                loggity = myin.toString();

                mHandler.post(new Runnable() 
                {
                    @Override
                    public void run() 
                    {
                            try 
                            {
                                    tv1.setText(loggity);
                            } catch (Exception e) 
                            {
                                    e.printStackTrace();
                            }
                    }
            });
            Log.i("ELEMENTS HTML", loggity);
            }
        };
        newsThread.start();

您可以在开始时初始化Hanlder。

试试下面的示例代码,不知道这是否是更好的方法:

public class MainThread {


public static void main(String args[]) {
    Thread2 t2 = new Thread2();
    Thread nextThread = new Thread(t2);
    nextThread.start();

    try {
        nextThread.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println();
    System.out.println(t2.getStr());

}

private static class Thread2 implements Runnable{
    private String str;

    @Override
    public void run() {
        setStr("T2 Thread String");

    }
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }

}


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM