Android致命信号11(SIGSEGV),代码1,tid 29092中的故障地址0x0

时间:2016-02-07 07:14:14

标签: java android android-animation fatal-error

我正在尝试在我的加载屏幕上播放加载动画,并且我在某处读取了android不支持GIF的内容,因此要么必须闯入帧然后播放它,要么我们可以使用Movie类。 / p>

继承人的主要活动 -

<Boolean expression> ? <expression> : <expression>

在上面的代码中,我通过传递一个MYGIFView.class的实例来设置内容视图 -

继承人MYGIFView.class

package com.myapp.mehul.login.activity;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.util.Log;

import com.myapp.mehul.login.MYGIFView;
import com.myapp.mehul.login.MainActivity;
import com.myapp.mehul.login.R;
import com.myapp.mehul.login.app.Constants;

import org.json.JSONException;
import org.json.JSONObject;

import java.net.URISyntaxException;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;


/**
 * Created by mehul on 2/6/16.
 */
public class LoadingScreen extends Activity {

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    /** Called when the activity is first created. */
    private Socket mSocket;
    String you;
    String opponentId;
    String username;

    {
        try {
            mSocket = IO.socket(Constants.CHAT_SERVER_URL);
        } catch (URISyntaxException e) {

            throw new RuntimeException(e);
        }
    }
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new MYGIFView(getApplicationContext()));
        //initialise the socket
        mSocket.connect();
        //call add user
        mSocket.emit("add user");
        //start a listener for opponent
        mSocket.on("opponent", onOpponent);
        //initialise the username
        username = getIntent().getExtras().getString("username");
    }

    private Emitter.Listener onOpponent = new Emitter.Listener(){
        @Override
        public  void call(final Object... args){
            LoadingScreen.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    JSONObject data = (JSONObject) args[0];

                    try {
                        you = data.getString("you");
                        opponentId = data.getString("opponent");
                        Log.d("LoadingScreen", data.toString());


                        //setResult(RESULT_OK, i);


                        finish();
                    } catch (JSONException e) {
                        return;
                    }
                    Intent i = new Intent(LoadingScreen.this, MainActivity.class);
                    i.putExtra("opponentId", opponentId);
                    i.putExtra("you", you);
                    i.putExtra("username", username);
                    Log.d("goToChat", username);
                    startActivity(i);
                }
            });
        }
    };

    @Override
    public void onBackPressed(){

        AlertDialog.Builder builder = new AlertDialog.Builder(LoadingScreen.this);
        builder.setMessage("I knew you didn't have BALLS.").setCancelable(
                false).setPositiveButton("I am a LOSER",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //send the logout information to the server
                        JSONObject discon = new JSONObject();
                        try {
                            discon.put("opponent", opponentId);
                            discon.put("you", you);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        mSocket.emit("discon", discon);
                        mSocket.disconnect();

                        //finish the current activity.
                        Intent intent = new Intent(LoadingScreen.this, MainMenu.class);
                        startActivity(intent);
                        LoadingScreen.this.finish();

                    }
                }).setNegativeButton("I'll fkin face it",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }

}

加载活动是创建一个MYGIFView.class的实例,它会记录数据但是它会给出致命的信号11.我试图搜索但我没有得到任何答案。

控制台日志 -

package com.myapp.mehul.login;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Movie;
import android.view.View;

import java.io.InputStream;

/**
 * Created by mehul on 2/7/16.
 */
public class MYGIFView extends View{
    Movie movie,movie1;

    InputStream is=null,is1=null;

    long moviestart;
    public MYGIFView(Context context) {
        super(context);

        is=context.getResources().openRawResource(+ R.drawable.loading);

        movie=Movie.decodeStream(is);

    }
    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawColor(Color.WHITE);
        super.onDraw(canvas);
        long now=android.os.SystemClock.uptimeMillis();
        System.out.println("now="+now);
        if (moviestart == 0) { // first time
            moviestart = now;

        }
        System.out.println("\tmoviestart="+moviestart);
        int relTime = (int)((now - moviestart) % movie.duration()) ;
        System.out.println("time="+relTime+"\treltime="+movie.duration());
        movie.setTime(relTime);
        movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);
        this.invalidate();
    }
}

3 个答案:

答案 0 :(得分:16)

我收到了一个关于这个问题的批次,这意味着它被大量查看,所以我会回答这个问题 -

我想到的是下面的一行是抛出错误 -

movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);

现在问题是这个错误特别是由于很多原因造成的,它从来没有特定的原因..我的工作原因不是因为我的设备在硬件加速方面效果不好,所以我只是必须在清单应用程序中禁用它,如下所示 -

<android:hardwareAccelerated="false">

现在可能的原因可能不一样......但核心原因是相同的,它的内存相关,并且大多数机会是它正在测试的设备或模拟器的固件中的错误。

答案 1 :(得分:9)

在您的活动中设置的清单中:

    <activity
        android:name="LoadingScreen"
        android:hardwareAccelerated="false">
    </activity>

答案 2 :(得分:1)

我在这里遇到了完全相同的问题,但在 React Native 中,所以我也会为需要它的人提供解决方案。该错误可能由 react-native-webview 和/或 React Navigation 触发。在某些情况下,像我一样,您不想在整个应用程序上禁用硬件加速,所以这里有一个解决方法:

react-native-webview

<WebView
  androidHardwareAccelerationDisabled
  source={source}
/>

反应导航 5

<NavigationContainer>
     <Stack.Navigator initialRouteName="HomeScreen">
          <Stack.Screen
            name="HomeScreen"
            component={HomeScreen}
            options={{
              animationEnabled: false,
            }}
          />
     </Stack.Navigator>
</NavigationContainer>

https://github.com/react-native-webview/react-native-webview/issues/575