Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从服务到活动的runOnUiThread_Android_Android Service - Fatal编程技术网

Android 从服务到活动的runOnUiThread

Android 从服务到活动的runOnUiThread,android,android-service,Android,Android Service,我有一个方法“send()”,它将值发送到服务器,然后从服务器获取响应0或1。然后我想激活一个方法,检查它是0还是1,然后我想激活一个方法,该方法位于从服务调用的MainActivity上 这是服务代码 public class SendThreadCommunication extends Thread { private final static String TAG = "SendThreadCommunication"; private final int READ_TIMEOU

我有一个方法“send()”,它将值发送到服务器,然后从服务器获取响应0或1。然后我想激活一个方法,检查它是0还是1,然后我想激活一个方法,该方法位于从服务调用的MainActivity上

这是服务代码

    public class SendThreadCommunication extends Thread {
private final static String TAG = "SendThreadCommunication";
private final int READ_TIMEOUT = 100000;
private final int CONNECTION_TINEOUT = 100000;
private Looper myLooper;
private int mResponseCode;
private String mData = "";

private final ServerRequest req;
// private RegisterUser user;
private static String ans;

public SendThreadCommunication(ServerRequest req) {

    this.req = req;
}

public String readWebData(InputStream stream) {

    String line = "";
    StringBuffer buffer = new StringBuffer();
    BufferedReader reader = new BufferedReader(new InputStreamReader(stream));

    try {
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block

    }
    return buffer.toString();

}

@Override
public void run() {
    try {
        send();
       // evaluateDataAndRespondToFragment(mData);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}


public void send() throws ClientProtocolException, IOException {
    OutputStream mOutputStream = null;
    BufferedWriter mWriter = null;

    List<NameValuePair> mParameters = req.getParameters();

    URL url = null;
    HttpURLConnection connection = null;
    try {
        Looper.prepare();
        url = new URL(req.returnRequestUrl());
        connection = (HttpURLConnection) url.openConnection();
        connection.setReadTimeout(READ_TIMEOUT);
        connection.setConnectTimeout(CONNECTION_TINEOUT);
        connection.setRequestMethod(Params.HTTP_REQUEST_METHOD_POST);
        connection.setDoOutput(true);
        connection.setDoInput(true);
        mOutputStream = connection.getOutputStream();
        mWriter = new BufferedWriter(new OutputStreamWriter(mOutputStream, Params.UTF8));
        String sparams = URLEncodedUtils.format(mParameters, Params.UTF8);
        mWriter.write(sparams);
        mWriter.flush();

        mResponseCode = connection.getResponseCode();
        if (mResponseCode > 203) {
            mData = readWebData(connection.getErrorStream());
            //this.req.getResponse().notGoodServerEroorr();
        } else {
            mData = readWebData(connection.getInputStream());

        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (connection != null) {
            try {
                if (mOutputStream != null)
                    mOutputStream.close();
                if (mWriter != null)
                    mWriter.close();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            connection.disconnect();
            evaluateDataAndRespondToFragment(mData);
            myLooper = Looper.myLooper();
            Looper.loop();
            myLooper.quit();

        }
    }
  }

private void evaluateDataAndRespondToFragment(String mData) {
    Listen lis = this.req.getResponse();

    if (mData.equals("1"))
        lis.good();
    else
        lis.notGood();

     if (mData.equals("0"))
     {
         lis.userGcmNotRegistered();
     }
    }
 }
  public class MainActivity extends Activity implements SensorEventListener, Listen {

private BroadcastReceiver statusReceiver;
private IntentFilter mIntent;
Sensor accelerometer;
SensorManager sm;
TextView acceleration;
SendValues sv;
int counter3 = 0;
int counter5 = 0;
int pastTime = 0;

private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }


@Override
public void good() {
    Toast.makeText(getApplication(), "successful transfer", Toast.LENGTH_LONG).show();
}

@Override
public void notGood() {
    Toast.makeText(getApplication(), "UNsuccssful transfer", Toast.LENGTH_LONG).show();
}

@Override
public void userGcmNotRegistered() {
    Toast.makeText(getApplication(), "There is some problem, please register again to the App", Toast.LENGTH_LONG).show();
  }

}

在这里它应该积极的方法之一“好”,“不好”。。。。 我知道RunUnuithRead处理它,但我不知道如何使用它和在哪里。
如果有人能告诉我该怎么做,我将不胜感激。

一项服务没有runOnUiThread方法,但您可以使用intent代替

简单地说

  • 广播接收器添加到活动中
  • 将接收者添加到您的AndroidManifest.xml中
  • 从您的服务中发送意向
  • MainActivity.java

    public class MainActivity extends Activity implements SensorEventListener, Listen {
    
        private BroadcastReceiver statusReceiver;
        private IntentFilter mIntent;
        Sensor accelerometer;
        SensorManager sm;
        TextView acceleration;
        SendValues sv;
        int counter3 = 0;
        int counter5 = 0;
        int pastTime = 0;
    
        private static final String TAG = "MainActivity";
    
        statusReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    switch(intent.getIntExtra("status", -1) {
                        case 1:
                            good();
                            break;
                        case 2:
                            notGood();
                            break;
                        default:
                            userGcmNotRegistered();
                    }
                }
            };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            registerReceiver(statusReceiver, new IntentFilter("com.yourpackage.yourapp.GET_STATUS_INTENT");
            }
    
    
        @Override
        public void good() {
            Toast.makeText(getApplication(), "successful transfer", Toast.LENGTH_LONG).show();
        }
    
        @Override
        public void notGood() {
            Toast.makeText(getApplication(), "UNsuccssful transfer", Toast.LENGTH_LONG).show();
        }
    
        @Override
        public void userGcmNotRegistered() {
            Toast.makeText(getApplication(), "There is some problem, please register again to the App", Toast.LENGTH_LONG).show();
          }
    
        }
    
    一个简单的AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.yourpackage.yourapp"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="19"
            android:targetSdkVersion="19" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.yourpackage.yourapp.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <receiver android:name="MainActivity">
                    <intent-filter>
                            <action android:name="com.yourpackage.yourapp.GET_STATUS_INTENT">
                            </action>
                    </intent-filter>
         </receiver>
        </application>
    </manifest>
    

    此外,您需要在活动的onResume/onPause方法中注册/取消注册。

    有点离题;但是,Beremaran的回答是正确的,您无法从服务获取主线程。然而,runOnUiThread是一个非常重要的概念,需要了解和使用,以避免阻塞主线程。阻止主线程将导致系统杀死你的应用程序

    假设你有一些网络任务要做,你知道这可能需要一些时间。因此,您需要启动一个新线程来执行缓慢的工作

    new Thread(new Runnable() {
        @Override
        public void run() {
           messageFromSlowStuff = doSomeSlowStuff();
        };
    }).start();
    
    现在,您可能希望使用新的数据消息FromSlowStuff填充UI,但您不能,因为它只是从主线程发出的声音

    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            myTextView.setText(messageFromSlowStuff)
        }
    });
    
    如果您只更新上面示例中的视图,则可以使用view.post()代替runOnUiThread

    myTextView.post(new Runnable() {
        public void run() {
            messageFromSlowStuff = doSomeSlowStuff();
            myTextView.setText(messageFromSlowStuff);
        }
    });
    

    以下是有关View.post()的文档:

    您可以将代码包装到AsyncTask中,该任务负责线程切换。我不知道为什么,但在“sendBroadcast”中,它给了我错误信息。它说我需要创建一个方法。我需要实现什么吗?“无法解析方法‘sendBroadcast(android.content.Intent)’
    sendBroadcast()
    服务
    的一种方法。但是,您发布的代码不是
    服务
    而是
    线程
    。在实例化
    SendThreadCommunication
    类时,需要将对
    服务
    的引用传递到
    SendThreadCommunication
    类中,然后可以对该引用调用
    sendBroadcast()
    myTextView.post(new Runnable() {
        public void run() {
            messageFromSlowStuff = doSomeSlowStuff();
            myTextView.setText(messageFromSlowStuff);
        }
    });