无法从内部线程或asynctask调用函数

时间:2011-02-24 18:50:32

标签: android multithreading android-asynctask

我在android中使用线程和处理程序。只要我没有活动之外的任何功能,该应用程序工作正常。但是如果我从一个线程内部从活动外部调用一些funcyion,它会产生NullPointerException。

package com.prog;

import com.API.TextBoxCheck;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class ProgressBarExample extends Activity {
    private Handler handler = new Handler();
    int i;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        Button btn=(Button)findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener(){
            TextView tv=(TextView)findViewById(R.id.textView1);

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Thread thread = new Thread(null, doBackgroundThreadProcessing,
                "Background");
                thread.start();
            }});
        Button stopBtn=(Button)findViewById(R.id.button2);
        stopBtn.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            finish();
            }});
    }

    private Runnable doBackgroundThreadProcessing = new Runnable() {
    public void run() {
    try {
        backgroundThreadProcessing();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
    };

    private void backgroundThreadProcessing() throws InterruptedException {

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

         i=0;
        while(i<100)
        {
            handler.post(doUpdateGUI);
        Thread.sleep(50);

        i++;    
        }
        EditText et=(EditText)findViewById(R.id.editText1);

        TextBoxCheck tbc = new com.API.TextBoxCheck();
        String reply=tbc.TextBoxChecker(et.getText().toString(),10);
        Log.d("thread", reply);
    }


    private Runnable doUpdateGUI = new Runnable() {
    public void run() {
    updateGUI();
    }

    private void updateGUI() {
        // TODO Auto-generated method stub
        TextView tv=(TextView)findViewById(R.id.textView1);
        tv.setText(i+"%");

    }
    };
}

我遗漏了textBoxCheck becoz的代码,我认为这可能是不必要的。 请帮帮我。

PS。 :我也尝试过使用AsyncTask但会出现同样的问题。

1 个答案:

答案 0 :(得分:1)

您不在UI线程上。您必须在UI线程上才能对任何UI项目进行操作。在UI线程上创建一个处理程序并调用backgroundThreadProcessing();来自处理程序而不是来自非UI线程。