在线程外使用String

时间:2011-07-11 00:05:33

标签: java android multithreading

我几乎整天都试图解决这个问题(或者感觉就像那样),我自己也不能这样做。所以我希望你能提供帮助。

首先,我点击了一个按钮 - 当发生这种情况时,会读取来自互联网的txt文件并保存在字符串中。在此过程中,ProcessDialog似乎显示该文件已被检索。

在下面的代码中,您将看到名为tv2的TextView,它纯粹是为了测试目的而实现的。

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.music);

    final TextView tv2 = (TextView)findViewById(R.id.textView1);
    Button btnMusicAll = (Button)findViewById(R.id.btnMusicAll);
    btnMusicAll.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            String wait = getString(R.string.pleaseWait);
            String retrievingInfo = getString(R.string.retrievingInfo);                             

            getReleaseInfoProgressDialog = ProgressDialog.show(Music.this, wait, retrievingInfo, true);

            new Thread()
            {
                public void run()
                {
                    try
                    {
                        headers = getStringFromUrl(getString(R.string.rlsHeaderURL));
                        setHeaders(headers,tv2);
                    }
                    catch(Exception e)
                    {
                        String error = getString(R.string.error0x01);
                        MessageShort(error);
                    }

                    // Remove progress dialog
                    getReleaseInfoProgressDialog.dismiss();
                }
            }.start();              
        }
    });
}

方法setHeaders:

public void setHeaders(final String hdr, final TextView tv)
{       
    try
    {
        runOnUiThread(
                new Runnable()
                {
                    public void run()
                    {                           
                            tv.setText(hdr);
                    }
                });
    }           
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

现在,我希望能够使用String'标题'。因为我想将它拆分并在之后使用它。 例如,我一直在尝试将上面的public void run()方法扩展为以下内容:

public void run()
{                           
    tv.setText(hdr);
    hej = hdr.split("\n");
    MessageShort(hej[1]);
}

MessageShort只是一个Toast方法,它将String作为参数。 'hej'被声明为:

public String[] hej = {};

如果'hdr'('headers')是“text01 \ ntext02 \ ntext03”,'hej'将是hej [0] = text01,hej [1] = text02等。

这也行得正常,一条Toast消息显示为hej [1]的“text02”。

这里真正的问题是我可以在这些正在运行的线程之外使用'hej'或'headers'。例如,如果我 - 在方法btnMusicAll.setOnClickListener之后 - 编写相同的MessageShort语句(MessageShort(hej [1]);) - 应用程序崩溃!如果我尝试以某种方式使用“标题”,它也会崩溃。

请帮忙。

3 个答案:

答案 0 :(得分:0)

听起来Async Task正是您所需要的。 创建一个派生自AsyncTask的类。覆盖doInBackground以下载文本并传递它。在做的同时可以发送进度消息。如果您准备好覆盖至少onPostExecute以定义应该发生的事情(在您的情况下显示您的Toast)

答案 1 :(得分:0)

由于您的节目无法运行,请尝试使用并检查结果。不确定是否有效

public void run()
{                           
tv.setText(hdr);
String tmpStr=new String(hdr);
hej = tmpStr.split("\n");
MessageShort(hej[1]);
}

答案 2 :(得分:0)

截止。

我设法让它发挥作用,但不确定这是否是最好的方法。

我使用AsyncTask,在我解释了onPostExecute方法中的ProgressDialog之后,我使用了putExtra方法来处理我需要字符串的Intent(从Internet上检索到)。我确信这在我上面的旧代码中也会起作用(不使用AsyncTask)。