нельзя вызывать функцию изнутри потока или асинхронной - PullRequest
0 голосов
/ 24 февраля 2011

Я использую поток и обработчик в Android. Приложение работает нормально, пока я не выполняю никаких функций вне деятельности. Но если я вызываю некоторую функцию извне действия из потока, это дает 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, потому что я думаю, что здесь может быть ненужно. Пожалуйста, помогите мне в этом.

PS. : Я также пытался использовать AsyncTask, но возникает та же проблема.

1 Ответ

1 голос
/ 24 февраля 2011

Вы не в теме пользовательского интерфейса.Вы должны быть в потоке пользовательского интерфейса, чтобы работать с любыми элементами пользовательского интерфейса.Создайте обработчик в потоке пользовательского интерфейса и вызовите функцию backgroundThreadProcessing ();из обработчика, а не из потока, не являющегося пользовательским интерфейсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...